Java8—日期时间API

2020年4月9日 | 作者 Siran | 1500字 | 阅读大约需要3分钟
归档于 Java | 标签 #Java
  • LocalDate : 该类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息。另外,它也不附带任何与时区相关的信息。

    //创建一个LocalDate对象并读取其值
    LocalDate date = LocalDate.of(2014, 3, 18); //2014-03-18
    int year = date.getYear(); //2014
    Month month = date.getMonth(); //MARCH
    int day = date.getDayOfMonth(); //18
    DayOfWeek dow = date.getDayOfWeek(); //TUESDAY
    int len = date.lengthOfMonth(); //31(days in March)
    boolean leap = date.isLeapYear(); //false (not a leap year)
    LocalDate today = LocalDate.now(); //2020-04-10 当天日期
      
    //使用TemporalField读取LocalDate的值
    int year = date.get(ChronoField.YEAR);
    int month = date.get(ChronoField.MONTH_OF_YEAR);
    int day = date.get(ChronoField.DAY_OF_MONTH);
      
    //以比较直观的方式操纵LocalDate的属性
    LocalDate date1 = LocalDate.of(2014, 3, 18);//2014-03-18
    LocalDate date2 = date1.withYear(2011);//2011-03-18
    LocalDate date3 = date2.withDayOfMonth(25);//2011-03-25
    LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);//2011-09-25
      
    //以相对方式修改LocalDate对象的属性
    LocalDate date1 = LocalDate.of(2014, 3, 18);//2014-03-18
    LocalDate date2 = date1.plusWeeks(1);//2014-03-25
    LocalDate date3 = date2.minusYears(3);//2011-03-25
    LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS);//2011-09-25
    

  • LocalTime: 一天中的时间,比如13:45:20,可以使用LocalTime类表示。

    //创建LocalTime并读取其值
    LocalTime time = LocalTime.of(13, 45, 20);//13:45:20
    int hour = time.getHour(); //13
    int minute = time.getMinute();//45
    int second = time.getSecond(); //20
      
    //LocalDate和LocalTime都可以通过解析代表它们的字符串创建。使用静态方法parse,你 可以实现这一目的:
    LocalDate date = LocalDate.parse("2014-03-18");
    LocalTime time = LocalTime.parse("13:45:20");
      
    

  • LocalDateTime :是LocalDate和LocalTime的合体。

    // 2014-03-18T13:45:20
    LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20); 
    LocalDateTime dt2 = LocalDateTime.of(date, time);
    LocalDateTime dt3 = date.atTime(13, 45, 20);
    LocalDateTime dt4 = date.atTime(time);
    LocalDateTime dt5 = time.atDate(date);
      
    LocalDate date1 = dt1.toLocalDate(); //2014-03-18
    LocalTime time1 = dt1.toLocalTime(); //13:45:20
    

  • Instant :机器的日期和时间格式 以Unix元年时间开始所经历的 秒数进行计算。

    Instant.ofEpochSecond(3); 
    Instant.ofEpochSecond(3, 0);
    Instant.ofEpochSecond(2, 1_000_000_000); //2秒之后再加上 100万纳秒(1秒)
    Instant.ofEpochSecond(4, -1_000_000_000);  //4秒之前的100万纳秒(1秒)
    Instant.now().getEpochSecond() //当前时间的秒数
    

  • 定义DurationPeriod

    //两个LocalTimes对象、两个LocalDateTimes对象,或者两个Instant对象之间的duration
    //由于Duration类主要用于以秒和纳 秒衡量时间的长短,你不能仅向between方法传递一个LocalDate对象做参数。
    Duration d1 = Duration.between(time1, time2);
    Duration d1 = Duration.between(dateTime1, dateTime2);
    Duration d2 = Duration.between(instant1, instant2);
    //如果你需要以年、月或者日的方式对多个时间单位建模,可以使用Period类。
    Period tenDays = Period.between(LocalDate.of(2014, 3, 8),
                                        LocalDate.of(2014, 3, 18));
    //创建Duration和Period对象
    Duration threeMinutes = Duration.ofMinutes(3);
    Duration threeMinutes = Duration.of(3, ChronoUnit.MINUTES);
    Period tenDays = Period.ofDays(10);
    Period threeWeeks = Period.ofWeeks(3);
    Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);
    

  • 使用TemporalAdjuster

    将日期调整到下个周日、下个工作日,或者是本月的最后一天。这时,你可 2 以使用重载版本的with方法,向其传递一个提供了更多定制化选择的TemporalAdjuster对象, 更加灵活地处理日期。

    LocalDate date1 = LocalDate.of(2014, 3, 18); //2014-03-18
    LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY)); //2014-03-23
    LocalDate date3 = date2.with(lastDayOfMonth());  //2014-03-31
    
    • dayOfWeekInMonth 创建一个新的日期,它的值为同一个月中每一周的第几天
    • firstDayOfMonth 创建一个新的日期,它的值为当月的第一天
    • firstDayOfNextMonth 创建一个新的日期,它的值为下月的第一天
    • firstDayOfNextYear 创建一个新的日期,它的值为明年的第一天
    • firstDayOfYear 创建一个新的日期,它的值为当年的第一天
    • firstInMonth 创建一个新的日期,它的值为同一个月中,第一个符合星期几要求的值
    • lastDayOfMonth 创建一个新的日期,它的值为当月的最后一天
    • lastDayOfNextMonth 创建一个新的日期,它的值为下月的最后一天
    • lastDayOfNextYear 创建一个新的日期,它的值为明年的最后一天
    • lastDayOfYear 创建一个新的日期,它的值为今年的最后一天
    • lastInMonth 创建一个新的日期,它的值为同一个月中,最后一个符合星期几要求的值
    • next/previous 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星 期几要求的日期
    • nextOrSame/previousOrSame 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星 期几要求的日期,如果该日期已经符合要求,直接返回该对象

  • 打印输出及解析日期-时间对象

    LocalDate date = LocalDate.of(2014, 3, 18);
    String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); //20140318 
    String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); //2014-03-18
      
    LocalDate date1 = LocalDate.parse("20140318",
                                     DateTimeFormatter.BASIC_ISO_DATE);
    LocalDate date2 = LocalDate.parse("2014-03-18",
                                     DateTimeFormatter.ISO_LOCAL_DATE);
      
    //按照某个模式创建DateTimeFormatter
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    LocalDate date1 = LocalDate.of(2014, 3, 18);
    String formattedDate = date1.format(formatter);
    LocalDate date2 = LocalDate.parse(formattedDate, formatter);
      
    //创建一个本地化的DateTimeFormatter
    DateTimeFormatter italianFormatter = DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.ITALIAN);
    LocalDate date1 = LocalDate.of(2014, 3, 18);
    String formattedDate = date.format(italianFormatter); // 18. marzo 2014 
    LocalDate date2 = LocalDate.parse(formattedDate, italianFormatter);
      
    //构造一个DateTimeFormatter 更加细致化的格式器
    DateTimeFormatter italianFormatter = new DateTimeFormatterBuilder() .appendText(ChronoField.DAY_OF_MONTH)
    .appendLiteral(". ")
    .appendText(ChronoField.MONTH_OF_YEAR)
                .appendLiteral(" ")
                .appendText(ChronoField.YEAR)
                .parseCaseInsensitive()
                .toFormatter(Locale.ITALIAN);