LocalDateTime 特性
线程安全
强大的API,包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作
相关类
LocalDateTime: 没有时区的日期时间
LocalDate: 没有时区的日期
LocalTime: 没有时区的时间
ZoneId: 时区标识
TemporalAdjusters: 常用的时间调整器
ChronoUnit: 标准的日期时间单位
Instant: 一个瞬时点在时间线上
DateTimeFormatter: 格式化程序打印和解析日期-时间对象
Api
1. 创建 LocalDateTime
```java
// 获取当前的日期时间
System.out.println("Create LocalDateTime_1: " + LocalDateTime.now());
// 通过 LocalDate, LocalTime 获得 LocalDateTime
System.out.println("Create LocalDateTime_2: " + LocalDateTime.of(LocalDate.now(), LocalTime.now()));
// 指定年月日时分秒 获得 LocalDateTime
System.out.println("Create LocalDateTime_3: " + LocalDateTime.of(1997, 11, 17, 11, 11, 11));
// 指定时区 获得 LocalDateTime
System.out.println("Create LocalDateTime_4: " + LocalDateTime.ofInstant(Instant.now(), ZoneId.of("Asia/Shanghai")));
```
复制代码
2. LocalDateTime 运算, 加减, 比较等操作
```java
LocalDateTime today = LocalDateTime.now();
//时间加减 加 plus, 减 minus
System.out.println("1 年后 " + today.plusYears(1));
System.out.println("1 天后 " + today.plusDays(1));
System.out.println("1 年前 " + today.minusYears(1));
System.out.println("1 周前 " + today.minusWeeks(1));
System.out.println("1 月前 " + today.minusMonths(1));
// 时间比较
System.out.println("是否相等: " + today.isEqual(today.minusDays(1)));
System.out.println("Today之后: " + today.isAfter(today.minusDays(1)));
System.out.println("Today之前: " + today.isBefore(today.minusDays(1)));
// 调整日期时间
System.out.println("年调整至 1997 年: " + today.withYear(1997));
System.out.println("月调整 2 月: " + today.withMonth(2));
System.out.println("每月的第一天: " + today.with(TemporalAdjusters.firstDayOfMonth()));
System.out.println("下个月的第一天: " + today.with(TemporalAdjusters.firstDayOfNextMonth()));
System.out.println("每年的最后一天: " + today.with(TemporalAdjusters.lastDayOfYear()));
// 判断是否是闰年
System.out.println("是否是闰年: " + today.toLocalDate().isLeapYear());
//两个日期间的间隔
System.out.println("今天与月末相差多少天: " + today.until(today.with(TemporalAdjusters.lastDayOfMonth()), ChronoUnit.DAYS));
```
复制代码
3. LocalDateTime, String, java.util.Date 相互转换
```java
Date date = new Date();
// java.util.Date 转换为 LocalDateTime 指定时区 CTT(Asia/Shanghai)
ZoneId ctt = ZoneId.of(ZoneId.SHORT_IDS.get("CTT"));
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ctt);
System.out.println("java.util.Date 转换为 LocalDateTime, 指定时区: " + localDateTime);
// java.util.Date 转换为 LocalDateTime 系统默认时区
ZoneId defaultZone = ZoneId.systemDefault();
System.out.println("java.util.Date 转换为 LocalDateTime, 系统默认时区: " + LocalDateTime.ofInstant(date.toInstant(), defaultZone));
//LocalDateTime 转换为 java.util.Date 指定时区
System.out.println("LocalDateTime 转换为 java.util.Date, 指定时区: " + Date.from(localDateTime.atZone(ctt).toInstant()));
//LocalDateTime 转换为 java.util.Date 系统默认时区
System.out.println("LocalDateTime 转换为 java.util.Date, 系统默认时区: " + Date.from(localDateTime.atZone(defaultZone).toInstant()));
//LocalDateTime 转换为 String
LocalDateTime today = LocalDateTime.now();
System.out.println("LocalDateTime 转换为 String: "+ today.format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")));
System.out.println("LocalDateTime 转换为 String: "+ today.format(DateTimeFormatter.ofPattern("YYYY-MM-dd")));
System.out.println("LocalDateTime 转换为 String: "+ today.format(DateTimeFormatter.ofPattern("MM-dd HH:mm")));
// String 转换为 LocalDateTime
System.out.println("String 转换为 LocalDateTime : " + LocalDateTime.parse("1997-11-17 11:11:11", DateTimeFormatter.ofPattern("yyyy-MM-dd[[ HH][:mm][:ss]]")));
System.out.println("String 转换为 LocalDate : " + LocalDate.parse("1997-11-17", DateTimeFormatter.ofPattern("yyyy-MM-dd")));
System.out.println("String 转换为 LocalTime : " + LocalTime.parse("11:11:11", DateTimeFormatter.ofPattern("HH:mm:ss")));
// 1997-11-17 当String类型时间没有时分秒时, DateTimeFormatter 需要设置为空时的默认值.
final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd[[ HH][:mm][:ss]]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0) // 时
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) // 分
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) // 秒
.parseDefaulting(ChronoField.MILLI_OF_SECOND, 0) // 毫秒
.toFormatter();
System.out.println("String 转换为 LocalDateTime : " + LocalDateTime.parse("1997-11-17", formatter));
```
复制代码