JDK8新时间类的使用

新时间类的使用

package data;

import org.junit.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Set;
import java.util.TimeZone;

/**
 * JDK8日期类的使用
 * LocalDate 本地日期
 * LocalTime 本地时间
 * LocalDateTime 本地日期时间
 * ZonedDateTime 时区
 * Duration 持续时间
 *
 * @author Manaphy
 */
public class Jdk8DatetimeTest {
    /**
     * LocalDate LocalTime LocalDateTime的使用
     */
    @Test
    public void test01() {
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.now();//相较于其他两个更常用
        System.out.println(localDate);//2019-12-11
        System.out.println(localTime);//21:37:35.182
        System.out.println(localDateTime);//2019-12-11T21:37:35.183

        //of():设置指定的年、月、日、时、分、秒。没有偏移量
        LocalDateTime localDateTime1 = LocalDateTime.of(2008, 8, 8, 8, 8, 8);
        System.out.println(localDateTime1);//2008-08-08T08:08:08

        //getXxx():获取相关的属性
        System.out.println(localDateTime.getMonth());//DECEMBER
        System.out.println(localDateTime.getMonthValue());//12
        System.out.println(localDateTime.getDayOfYear());//345
        System.out.println(localDateTime.getDayOfMonth());//11
        System.out.println(localDateTime.getDayOfWeek());//WEDNESDAY

        //体现不可变性
        //withXxx():设置相关的属性
        LocalDate localDate1 = localDate.withDayOfMonth(22);
        System.out.println(localDate);//2019-12-11
        System.out.println(localDate1);//2019-12-22

        LocalDateTime localDateTime2 = localDateTime.plusDays(3);//日期加3天
        System.out.println(localDateTime);//2019-12-11T21:58:40.649
        System.out.println(localDateTime2);//2019-12-14T21:58:40.649

        LocalDateTime localDateTime3 = localDateTime.minusMonths(3);//日期减3个月
        System.out.println(localDateTime);//2019-12-11T21:59:56.750
        System.out.println(localDateTime3);//2019-09-11T21:59:56.750
    }

    /**
     * Instant的使用 Instant的精度可以达到纳秒级
     * 类似于 java.util.Date类
     */
    @Test
    public void test02() {
        //now():获取本初子午线对应的标准时间
        Instant instant = Instant.now();
        System.out.println(instant);//2019-12-11T14:11:50.643Z

        //添加时间的偏移量
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));//东八区时间
        System.out.println(offsetDateTime);//2019-12-11T22:11:50.643+08:00

        //toEpochMilli():获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数  ---> Date类的getTime()
        long milli = instant.toEpochMilli();
        System.out.println(milli);//1576073601185

        //ofEpochMilli():通过给定的毫秒数,获取Instant实例  -->Date(long millis)
        Instant instant1 = Instant.ofEpochMilli(1576073601185L);
        System.out.println(instant1);//2019-12-11T14:13:21.185Z
    }

    /**
     * 日期格式化
     */
    @Test
    public void test03() {
        //方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
        DateTimeFormatter isoLocalDateTime = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        //格式化:日期-->字符串
        LocalDateTime localDateTime = LocalDateTime.now();
        String str = isoLocalDateTime.format(localDateTime);
        System.out.println(localDateTime);//2019-12-11T22:27:44.332
        System.out.println(str);//2019-12-11T22:27:44.332

        //解析:字符串 -->日期
        TemporalAccessor parse = isoLocalDateTime.parse("2019-02-18T15:42:18.797");
        System.out.println(parse);//{},ISO resolved to 2019-02-18T15:42:18.797

        //方式二:
        //本地化相关的格式。如:ofLocalizedDateTime()
        //FormatStyle.LONG-->2019年12月11日 下午10时38分00秒
        //FormatStyle.MEDIUM-->2019-12-11 22:38:32
        //FormatStyle.SHORT-->19-12-11 下午10:39
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
        String format = dateTimeFormatter.format(localDateTime);
        System.out.println(format);

        //本地化相关的格式。如:ofLocalizedDate()
        //FormatStyle.FULL-->2019年12月11日 星期三
        //FormatStyle.LONG-->2019年12月11日
        //FormatStyle.MEDIUM-->2019-12-11
        //FormatStyle.SHORT-->19-12-11
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
        String format1 = dateFormatter.format(LocalDate.now());
        System.out.println(format1);

        //方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd HH:mm:ss E”)-->重点
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss E");
        //格式化
        String format2 = formatter.format(localDateTime);
        System.out.println(format2);//2019-12-11 22:47:24 星期三

        //解析
        TemporalAccessor accessor = formatter.parse(format2);
        System.out.println(accessor);//{},ISO resolved to 2019-12-11T22:48:38

    }

    /**
     * 时区相关的类
     */
    @Test
    public void test04() {
        //ZoneId:类中包含了所有的时区信息
        Set<String> zoneIds = ZoneId.getAvailableZoneIds();//获取所有的ZoneId
        for (String zoneId : zoneIds) {
            System.out.println(zoneId);
        }

        //获取指定时区的时间
        LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
        System.out.println(localDateTime);//2019-12-12T00:12:32.172

        //获取本时区的ZonedDateTime对象
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        System.out.println(zonedDateTime);//2019-12-11T23:12:32.225+08:00[Asia/Shanghai]

        //获取指定时区的ZonedDateTime对象
        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
        System.out.println(now);//2019-12-12T00:14:06.854+09:00[Asia/Tokyo]
    }

    /**
     * Duration类的使用
     * 用于计算两个"时间"间隔,以秒和纳秒为基准
     */
    @Test
    public void test05() {
        LocalTime localTime = LocalTime.now();
        LocalTime localTime1 = LocalTime.of(15, 23, 32);
        //between():静态方法,返回Duration对象,表示两个时间的间隔
        Duration duration = Duration.between(localTime1, localTime);
        System.out.println(duration);//PT7H53M0.427S
        System.out.println(duration.getSeconds());//28441
        System.out.println(duration.getNano());//90000000

        LocalDateTime localDateTime = LocalDateTime.of(2016, 6, 12, 15, 23, 32);
        LocalDateTime localDateTime1 = LocalDateTime.of(2017, 6, 12, 15, 23, 32);
        Duration duration1 = Duration.between(localDateTime1, localDateTime);
        System.out.println(duration1.toDays());//-365


    }

    /**
     * Period类的使用
     * 用于计算两个"日期"间隔,以年、月、日衡量
     */
    @Test
    public void test06() {
        LocalDate localDate = LocalDate.now();//2019-12-11
        LocalDate localDate1 = LocalDate.of(2021, 2, 14);
        Period period = Period.between(localDate, localDate1);
        System.out.println(period);//P1Y2M3D 表示相差1年2个月3天
        //相差的年数
        System.out.println(period.getYears());//1
        //相差的月数
        System.out.println(period.getMonths());//2
        //相差的天数
        System.out.println(period.getDays());//3
        Period period1 = period.withYears(1);
        System.out.println(period1);//P2Y3M7D


    }

    /**
     * TemporalAdjuster:时间校正器
     */
    @Test
    public void test07() {
        //获取当前日期的下一个周日是哪天
        TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);
        LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
        System.out.println(localDateTime);//2019-12-15T09:05:46.866
        //获取下一个工作日是哪天
        LocalDate localDate = LocalDate.now().with((Temporal temporal) -> {
            LocalDate date = (LocalDate) temporal;
            if (date.getDayOfWeek().equals(DayOfWeek.FRIDAY)) {
                return date.plusDays(3);
            } else if (date.getDayOfWeek().equals(DayOfWeek.SATURDAY)) {
                return date.plusDays(2);
            } else {
                return date.plusDays(1);
            }
        });
        System.out.println("下一个工作日是:" + localDate);//下一个工作日是:2019-12-13
    }

    /**
     * 与传统日期处理的转换
     */
    @Test
    public void test08() {
        Date date = new Date();
        Instant instant = date.toInstant();
        Date date1 = Date.from(instant);

        GregorianCalendar calendar = new GregorianCalendar(2999, 8, 9, 10, 10, 50);
        ZonedDateTime zonedDateTime = calendar.toZonedDateTime();
        GregorianCalendar calendar1 = GregorianCalendar.from(zonedDateTime);

        TimeZone timeZone = TimeZone.getDefault();
        ZoneId zoneId = timeZone.toZoneId();
        TimeZone timeZone1 = TimeZone.getTimeZone(zoneId);

    }
}
发布了25 篇原创文章 · 获赞 1 · 访问量 1982

猜你喜欢

转载自blog.csdn.net/weixin_45631876/article/details/103503105