JDK 1.8 LocalDateTime LocalDate ZonedDateTime使用笔记
一、常见用法
1. 格式化
// 线程安全的类
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
String nowStr = now.format(DATE_TIME_FORMATTER);
2. UTC时间转本地时间
后端使用Map接受前端日期控件值时,接收的值有时为UTC字符串
// 2022-03-31T09:54:29.693Z UTC时间 本地时间+8为2022-03-31 17:54:29
String str = "2022-03-31T09:54:29.693Z";
final ZonedDateTime utcZonedDateTime = ZonedDateTime.parse(str);
// UTC转系统时区
final ZonedDateTime systemZonedDateTime = utcZonedDateTime.withZoneSameInstant(ZoneId.systemDefault());
final LocalDateTime localDateTime = systemZonedDateTime.toLocalDateTime();
3. 时间比较、偏移
彻底抛弃
Date
工具类Calendar
LocalDateTime.now().isAfter(createTime().plusDays(15));
4. 时间间隔
结合
Duration
可以轻松获取两个时间间隔(支持天、时、分、秒、毫秒等)
Duration.between(createTime, LocalDateTime.now()).toDays();
二、序列化与反序列化
1. 日期序列化
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate expiryDate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
2. 日期反序列化
@DateTimeFormat
默认不使用ISO格式解析,pattern 参数优先级高于iso参数;此注解在使用@RequestParam
或form表单请求
时(请求参数为对象,例如@PostMapping("/hello") public String hello(Hello hello){...}
)会生效;
@JsonFormat
也可用于日期反序列化,但前提是jackson框架;此注解在使用@RequestBody
时会生效。
总结:针对form表单请求
和json请求
两种方式,使用反序列注解不一样,一般可以同时使用(建议pattern保持一致),来支持大部分场景例如
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime;
3.1 @RequestParam参数
- 2000-10-31
@RequestParam("expiryDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate expiryDate
@RequestParam("expiryDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate expiryDate
- 2000-10-31 01:30:00
The most common ISO DateTime Format yyyy-MM-dd’T’HH:mm:ss.SSSZ, e.g. “2000-10-31T01:30:00.000-05:00”.
@RequestParam("createTime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime createTime;
- 2000-10-31 01:30:00
@RequestParam("createTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime createTime;
3.2 @RequestBody对象
- 2000-10-31
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate expiryDate;
- 2000-10-31T01:30:00.000-05:00
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;