LocalDateTime 、LocalDate、LocalTime是 Java8 提供的位于 java.time 包下的新的日期与时间处理类。一个重要的特性是它们都是线程安全的。
源码注释:
This class is immutable and thread-safe.(不可变、线程安全)
获取当前日期-时间:now
LocalDateTime包含年月日时分秒:
LocalDateTime localDateTime = LocalDateTime.now();

LocalDate只包含年月日:
LocalDate localDate = LocalDate.now();

LocalTime只包含时分秒:
LocalTime localTime = LocalTime.now();

获取指定日期-时间:of
//获取2020年4月1日12时0分0秒的日期时间
LocalDateTime localDateTime = LocalDateTime.of(2020, 4, 1, 12, 0, 0);
//或者先指定LocalDate、LocalTime
LocalDate localDate = LocalDate.of(2020, 4, 1);
LocalTime localTime = LocalTime.of(12, 0, 0);
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
解析字符串日期-时间:parse
使用 DateTimeFormatter.ofPattern(String pattern) 指定解析格式。
LocalDateTime localDateTime = LocalDateTime.parse("2020-04-02 12:12:12", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDate localDate = LocalDate.parse("2020/04/01", DateTimeFormatter.ofPattern("yyyy/MM/dd"));
LocalTime localTime = LocalTime.parse("121212", DateTimeFormatter.ofPattern("HHmmss"));
注意:使用 LocalDateTime.parse() 解析时要解析的字符串日期要包含时分秒,否则将报解析异常。
格式化日期-时间:format
使用 DateTimeFormatter.ofPattern(String pattern) 指定格式化格式。
LocalDateTime localDateTime = LocalDateTime.of(2020, 4, 1, 12, 0, 0);
String dateTime = localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
> 结果:2020/04/01 12:00:00
LocalDate localDate = LocalDate.now();
String date = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
> 结果:2020-04-01
LocalTime localTime = LocalTime.now();
String time = localTime.format(DateTimeFormatter.ofPattern("HH:mm:ss"));
> 结果:12:12:12
日期-时间增减:plus、minus
LocalDateTime localDateTime = LocalDateTime.now();
localDateTime = localDateTime.minusYears(2); //加两年
localDateTime = localDateTime.minusMonths(2); //减两月
......
//指定加减的单位
localDateTime = localDateTime.minus(1, ChronoUnit.DAYS); //减一天
localDateTime = localDateTime.plus(1, ChronoUnit.HOURS); //加一小时
日期时间间隔:Duration
Duration用于获取两时间的间隔秒+纳秒,传入的时间对象必须含有秒SECONDS单元,所以可以计算LocalDateTime、LocalTime,不能用于计算LocalDate。如果两对象是不同类型的,则根据第一个对象的类型来计算时间间隔。例如,如果第一个参数是LocalTime,则第二个参数将转换为LocalTime。
//计算两个LocalDateTime的秒间隔
LocalDateTime start = LocalDateTime.of(2020, 2, 29, 12, 0, 0);
LocalDateTime end = LocalDateTime.of(2020, 4, 3, 12, 0, 0);
Duration duration = Duration.between(start, end);
//计算两个LocalTime的秒间隔
Duration duration1 = Duration.between(LocalTime.of(12, 0, 0), LocalTime.of(14, 0, 0));
获取的结果:

根据
Duration转换天toDays、小时toHours、分钟toMinutes
long days = duration.toDays();
long hours = duration.toHours();
long minutes = duration.toMinutes();
Duration也可使用plus、minus进行增减操作
duration = duration.plusDays(1); //加一天
duration = duration.minus(1, ChronoUnit.HOURS); //减一小时
日期间隔:Period
Period用于获取一个期间,该期间由两个日期之间的年,月和日组成。包括开始日期,但不包括结束日期
LocalDate start = LocalDate.of(2018, 2, 12);
LocalDate end = LocalDate.of(2020, 4, 1);
Period period = Period.between(start, end);
//提取间隔年、月、天
int days = period.getDays();
int months = period.getMonths();
int years = period.getYears();

注意:从上面可以看出,使用
Period获取的的间隔会做合并处理。比如3月1日至3月31日则记为一个月。实列:从2010-01-15到2011-03-18是一年零两个月零三天。
之前说了使用Duration可以计算LocalDateTime、LocalTime,不能用于计算LocalDate间隔。使用Period获取的的间隔又会做合并处理。那么怎么才能求两个LocalDate的实际间隔天数呢?答案是使用toEpochDay:
LocalDate start = LocalDate.of(2020, 2, 12);
LocalDate end = LocalDate.of(2020, 4, 1);
long days = end.toEpochDay() - start.toEpochDay();
Instant
获取当前时间:now
//默认UTC时区
Instant instant = Instant.now();
System.err.println(instant);
//使用时区偏移获取当前时区
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.err.println(offsetDateTime);
输出结果:
2020-07-12T12:46:52.733Z
2020-07-12T20:46:52.733+08:00
时间戳:
7instant.toEpochMilli();
TemporalAdjuster:时间校正器
TemporalAdjusters:该类通过静态方法提供了大量的常用TemporalAdjuster的实现
举例:
LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime lo = dateTime.with(TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY));
System.err.println(lo);
输出结果:2020-07-03T22:12:05.123