Java8中新的时间API

传统的时间 API 存在线程安全的问题,在多线程开发中必须要上锁,所以 java8 现在为我们提供了一套全新的时间日期 API .
这里先给出时间API之间的关系图:
Java8中新的时间API_第1张图片

1. LocalDate、 LocalTime、 LocalDateTime

LocalDate、 LocalTime、 LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。
# LocalDate是当前日期,LocalTime是当前时间,
#LocalDateTime是前面两个的结合体,使用相同。
LocalDateTime ldt = LocalDateTime.now();
    System.out.println(ldt);
    LocalDateTime ld2 = LocalDateTime.of(2020, 3, 21, 10, 10, 10);
    System.out.println(ld2);
    # 可以加日期
    LocalDateTime ldt3 = ld2.plusYears(20);
    System.out.println(ldt3);
    #可以进行减日期
    LocalDateTime ldt4 = ld2.minusMonths(2);
    System.out.println(ldt4);
    
# 获取时间的年、月、日
     
        LocalDateTime now = LocalDateTime.of(2020, 3, 21, 10, 10, 10);
        //获取年
        int year = now.getYear();
        //获取月
        Month month = now.getMonth();
        //获取月的value值
        int monthValue = now.getMonthValue();
        //获取在本月的第几天(日)
        int dayOfMonth = now.getDayOfMonth();
        //获取在本年的第几天
        int dayOfYear = now.getDayOfYear();
        //获取在本周的第几天(星期几)
        DayOfWeek dayOfWeek = now.getDayOfWeek();
        //获取小时
        int hour = now.getHour();
        //获取分钟
        int minute = now.getMinute();
        //获取秒
        int second = now.getSecond();
        //获取纳秒
        int nano = now.getNano();

2. Instant : 时间戳。(使用 Unix 元年 1970年1月1日 00:00:00 所经历的毫秒值)

    Instant ins = Instant.now();  //默认使用 UTC 时区
    System.out.println(ins);
        
    OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8));//添加偏移的时区
    System.out.println(odt);
        
    System.out.println(ins.getNano());

    System.out.println(ins.toEpochMilli());//获得时间戳
        
    Instant ins2 = Instant.ofEpochSecond(5);
    System.out.println(ins2);

3. Duration 和 Period

**Duration : 用于计算两个“时间”间隔
Period : 用于计算两个“日期”间隔**

    Instant ins1 = Instant.now();
        
    System.out.println("--------------------");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
    }
        
    Instant ins2 = Instant.now();
        
    System.out.println("所耗费时间为:" +  Duration.between(ins1, ins2));
        
    System.out.println("----------------------------------");
        
    LocalDate ld1 = LocalDate.now();
    LocalDate ld2 = LocalDate.of(2020, 3, 26);

    Period pe = Period.between(ld2, ld1);
    System.out.println(pe.getYears());
    System.out.println(pe.getMonths());
    System.out.println(pe.getDays());
    }

这样获得两个日期之间的间隔是被包装成年月日分开的,想要计算两个日期之间的具体总天数,可以使用如下:

        LocalDate dateBefore = LocalDate.of(2015,1,20);
    LocalDate dateAfter = LocalDate.of(2020,3,25);
    long daysBetween = DAYS.between(dateBefore, dateAfter);

    System.out.println(daysBetween);

4. emporalAdjuster : 时间校正器

Java8中新的时间API_第2张图片

LocalDateTime ldt = LocalDateTime.now();
    System.out.println(ldt);

    //调整当前的日期为10号
    LocalDateTime ldt2 = ldt.withDayOfMonth(10);
    System.out.println(ldt2);

    //获得下个周日
    LocalDateTime ldt3 = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
    System.out.println(ldt3);
    
    //自定义:下一个工作日,工作日是指下一个上班的时间
    LocalDateTime ldt5 = ldt.with((t) -> {
        LocalDateTime ldt4 = (LocalDateTime) t;
        
        DayOfWeek dow = ldt4.getDayOfWeek();
        
        if(dow.equals(DayOfWeek.FRIDAY)){
            return ldt4.plusDays(3);
        }else if(dow.equals(DayOfWeek.SATURDAY)){
            return ldt4.plusDays(2);
        }else{
            return ldt4.plusDays(1);
        }
    });
    
    System.out.println(ldt5);

5. DateTimeFormatter : 解析和格式化日期或时间

默认已经有很多种样式
// DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE;

        //可以自定义样式
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");
        
    LocalDateTime ldt = LocalDateTime.now();
    String strDate = ldt.format(dtf);
        
    System.out.println(strDate);

    //字符串转回日期.指定格式化的样式
    LocalDateTime newLdt = ldt.parse(strDate, dtf);
    System.out.println(newLdt);

6. ZonedDate、ZonedTime、ZonedDateTime : 带时区的时间或日期

//获得所有的时区
    Set ids = ZoneId.getAvailableZoneIds();
    ids.forEach(System.out::println);

    LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
    System.out.println(ldt);
    
    ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("US/Pacific"));
    System.out.println(zdt);

7. 与传统日期的转换

Java8中新的时间API_第3张图片

你可能感兴趣的:(程序员,java8,时间)