Java 8 新日期时间 API

Java 8 新日期时间 API

1. LocalDate、LocalTime、LocalDateTime

LocalDate、LocalTime、LocalDateTime 实例是不可变的对象,分别表示使用 ISO-8601 日历系统的日期、时间、日期时间。它们提供简单的日期或时间,并不包含当前的时间信息。与不包含与时区相关的信息。

public void test1(){
    LocalDateTime ldt = LocalDateTime.now();
    System.out.println(ldt);

    LocalDateTime ld2 = LocalDateTime.of(2016, 11, 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);

    System.out.println(ldt.getYear());
    System.out.println(ldt.getMonthValue());
    System.out.println(ldt.getDayOfMonth());
    System.out.println(ldt.getHour());
    System.out.println(ldt.getMinute());
    System.out.println(ldt.getSecond());
}

2. Instant(时间戳)

使用 Unix 元年 1970年1月1日 00:00:00 所经历的毫秒值。

public void test2(){
    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());
    
    Instant ins2 = Instant.ofEpochSecond(5);
    System.out.println(ins2);
}

3. Duration 和 Period

  • Duration : 用于计算两个时间间隔
  • Period : 用于计算两个日期间隔
public void test3() throws InterruptedException {
    Instant ins1 = Instant.now();
    Thread.sleep(1000);
    Instant ins2 = Instant.now();
    System.out.println("所耗费时间为:" + Duration.between(ins1, ins2));
    
    System.out.println("----------------------------------");
    
    LocalDate ld1 = LocalDate.now();
    LocalDate ld2 = LocalDate.of(2011, 1, 1);
    
    Period pe = Period.between(ld2, ld1);
    System.out.println(pe.getYears());
    System.out.println(pe.getMonths());
    System.out.println(pe.getDays());
}

4. 时间校正器

  • TemporalAdjuster 时间校正器。有时我们可能需要获例如:将日期调整到 "下个周日" 等操作。

  • TemporalAdjusters 该类通过静态方法提供了大量的常用 TemporalAdjuster 的实现。

public void test4(){
    LocalDateTime ldt = LocalDateTime.now();
    System.out.println(ldt);
    
    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((l) -> {
        LocalDateTime ldt4 = (LocalDateTime) l;
        
        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(解析和格式化日期或时间)

public void test5(){
    DateTimeFormatter dtf;

    //dtf = DateTimeFormatter.ISO_LOCAL_DATE;
    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(带时区的时间或日期)

Java 8 中加入了对时区的支持,带日时区的时间为分别为 ZonedDate、ZonedTime、ZonedDateTime 其中每个时区都对应着 ID,地区 ID 都为 "{区域/(城市}" 的格式,例如:Asia/Shanghai

// 所有支持的时区
public void test6(){
    Set<String> set = ZoneId.getAvailableZoneIds();
    set.forEach(System.out::println);
}

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

Java 8 新特性

  1. Java 8 Lambda 表达式
  2. Java 8 Stream API
  3. Java 8 Optional 类深度解析
  4. Java 8 新时间日期 API
  5. Java 8 接口中的默认方法与静态方法
  6. Java 8 可重复注解与类型注解

posted on 2018-03-21 19:03  binarylei  阅读(217)  评论(0编辑  收藏  举报

导航