java8新的日期和时间API

比眉伴天荒 2022-04-11 14:09 412阅读 0赞

LocalDate 、 LocalTime 、 Instant 、 Duration 以及 Period

  1. LocalDate date = LocalDate.of(2014, 3, 18);
  2. int year = date.getYear();
  3. Month month = date.getMonth();
  4. int day = date.getDayOfMonth();
  5. DayOfWeek dow = date.getDayOfWeek();
  6. int len = date.lengthOfMonth();
  7. boolean leap = date.isLeapYear();
  8. LocalDate today = LocalDate.now();

TemporalField

TemporalField 是一个接口,它定义了如何访问 temporal 对象某个字段的值 ,ChronoField 枚举实现了这一接口,所以你可以很
方便地使用 get 方法得到枚举元素的值

  1. int year = date.get(ChronoField.YEAR);
  2. int month = date.get(ChronoField.MONTH_OF_YEAR);
  3. int day = date.get(ChronoField.DAY_OF_MONTH);

LocalDate 和 LocalTime 都可以通过解析代表它们的字符串创建。使用静态方法 parse ,你可以实现这一目的:

  1. LocalDate date = LocalDate.parse("2014-03-18");
  2. LocalTime time = LocalTime.parse("13:45:20");

你可以向 parse 方法传递一个 DateTimeFormatter

LocalDateTime:

  1. LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
  2. LocalDateTime dt2 = LocalDateTime.of(date, time);
  3. LocalDateTime dt3 = date.atTime(13, 45, 20);
  4. LocalDateTime dt4 = date.atTime(time);
  5. LocalDateTime dt5 = time.atDate(date);
  6. LocalDate date1 = dt1.toLocalDate();
  7. LocalTime time1 = dt1.toLocalTime();

Instant :这也是新的 java.time.Instant 类对时间建模的方式,基本上它是以Unix元年时间(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的秒数进行计算。

Duration:前为止,你看到的所有类都实现了 Temporal 接口, Temporal 接口定义了如何读取和操纵为时间建模的对象的值,

你可以创建两个 LocalTimes 对象、两个 LocalDateTimes:

  1. Duration d1 = Duration.between(time1, time2);
  2. Duration d1 = Duration.between(dateTime1, dateTime2);
  3. Duration d2 = Duration.between(instant1, instant2);

如果你需要以年、月或者日的方式对多个时间单位建模,可以使用 Period 类。使用该类的工厂方法 between ,你可以使用得到两个 LocalDate 之间的时长,如下所示:

  1. Period tenDays = Period.between(LocalDate.of(2014, 3, 8),
  2. LocalDate.of(2014, 3, 18));
  3. Duration threeMinutes = Duration.ofMinutes(3);
  4. Duration threeMinutes = Duration.of(3, ChronoUnit.MINUTES);
  5. Period tenDays = Period.ofDays(10);
  6. Period threeWeeks = Period.ofWeeks(3);
  7. Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);

Duration 类和 Period 类共享了很多相似的方法:

  1. 是否是静态方法 方法描述
  2. between 创建两个时间点之间的 interval
  3. from 由一个临时时间点创建 interval
  4. of 由它的组成部分创建 interval的实例
  5. parse 由字符串创建 interval 的实例
  6. addTo 创建该 interval 的副本,并将其叠加到某个指定的 temporal 对象
  7. get 读取该 interval 的状态
  8. isNegative 检查该 interval 是否为负值,不包含零
  9. isZero 检查该 interval 的时长是否为零
  10. minus 通过减去一定的时间创建该 interval 的副本
  11. multipliedBy interval 的值乘以某个标量创建该 interval 的副本
  12. negated 以忽略某个时长的方式创建该 interval 的副本
  13. plus 以增加某个指定的时长的方式创建该 interval 的副本
  14. subtractFrom 从指定的 temporal 对象中减去该 interval

操纵、解析和格式化日期

  1. LocalDate date1 = LocalDate.of(2014, 3, 18);
  2. LocalDate date2 = date1.withYear(2011);
  3. LocalDate date3 = date2.withDayOfMonth(25);
  4. LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);
  5. LocalDate date1 = LocalDate.of(2014, 3, 18);
  6. LocalDate date2 = date1.plusWeeks(1);
  7. LocalDate date3 = date2.minusYears(3);
  8. LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS);

表示时间点的日期-时间类的通用方法

  1. from 依据传入的 Temporal 对象创建对象实例
  2. now 依据系统时钟创建 Temporal 对象
  3. of Temporal 对象的某个部分创建该对象的实例
  4. parse 由字符串创建 Temporal 对象的实例
  5. atOffset Temporal 对象和某个时区偏移相结合
  6. atZone Temporal 对象和某个时区相结合
  7. format 使用某个指定的格式器将 Temporal 对象转换为字符串( Instant 类不提供该方法)
  8. get 读取 Temporal 对象的某一部分的值
  9. minus 创建 Temporal 对象的一个副本,通过将当前 Temporal 对象的值减去一定的时长创建该副本
  10. plus 创建 Temporal 对象的一个副本,通过将当前 Temporal 对象的值加上一定的时长创建该副本
  11. with 以该 Temporal 对象为模板,对某些状态进行修改创建该对象的副本

TemporalAdjuster

  1. import static java.time.temporal.TemporalAdjusters.*;
  2. LocalDate date1 = LocalDate.of(2014, 3, 18);
  3. LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY));
  4. LocalDate date3 = date2.with(lastDayOfMonth());

TemporalAdjuster 类中的工厂方法

  1. dayOfWeekInMonth 创建一个新的日期,它的值为同一个月中每一周的第几天
  2. firstDayOfMonth 创建一个新的日期,它的值为当月的第一天
  3. firstDayOfNextMonth 创建一个新的日期,它的值为下月的第一天
  4. firstDayOfNextYear 创建一个新的日期,它的值为明年的第一天
  5. firstDayOfYear 创建一个新的日期,它的值为当年的第一天
  6. firstInMonth 创建一个新的日期,它的值为同一个月中,第一个符合星期几要求的值
  7. lastDayOfMonth 创建一个新的日期,它的值为当月的最后一天
  8. lastDayOfNextMonth 创建一个新的日期,它的值为下月的最后一天
  9. lastDayOfNextYear 创建一个新的日期,它的值为明年的最后一天
  10. lastDayOfYear 创建一个新的日期,它的值为今年的最后一天
  11. lastInMonth 创建一个新的日期,它的值为同一个月中,最后一个符合星期几要求的值
  12. next/previous 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期
  13. nextOrSame/previousOrSame 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星
  14. 期几要求的日期,如果该日期已经符合要求,直接返回该对象

格式化日期和解析日期

  1. LocalDate date = LocalDate.of(2014, 3, 18);
  2. String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);
  3. String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
  4. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
  5. LocalDate date1 = LocalDate.of(2014, 3, 18);
  6. String formattedDate = date1.format(formatter);
  7. LocalDate date2 = LocalDate.parse(formattedDate, formatter);

处理不同的时区:

  1. LocalDate date = LocalDate.of(2014, Month.MARCH, 18);
  2. ZonedDateTime zdt1 = date.atStartOfDay(romeZone);
  3. LocalDateTime dateTime = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45);
  4. ZonedDateTime zdt2 = dateTime.atZone(romeZone);
  5. Instant instant = Instant.now();
  6. ZonedDateTime zdt3 = instant.atZone(romeZone);

发表评论

表情:
评论列表 (有 0 条评论,412人围观)

还没有评论,来说两句吧...

相关阅读