有道是:无规矩不成方圆。Java日期处理最能体现一个团队的成熟度。
POJO中常用的日期类型有:
- Date
- LocalDate/LocalDateTime
- Long
序列化成JSON以后常用的格式:
yyyy-MM-dd'T'HH:mm:ss.SSSZ(ISO8601,Java默认格式)
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd
时间戳(精度为秒或者毫秒)
本文从前后端接口角度约定以下日期处理方式。
对象 | Date | LocalDateTime | LocalDate | LocalTime |
---|---|---|---|---|
格式 | yyyy-MM-dd HH:mm:ss | yyyy-MM-dd HH:mm:ss | yyyy-MM-dd | HH:mm:ss |
Long类型表示日期一般出现在OpenAPI,故不做推荐。
例1. Date对象序列化:
@GetMapping(value = "/now")
public Date getTimestamp() {
return new Date();
}
请求:
curl http://localhost:8080/now
响应:2020-02-21 12:15:45
例2. LocalDateTime作为入参(Path):
@GetMapping(value = "/hello/{someDate}")
public LocalDateTime getTimestamp(@PathVariable LocalDateTime someDate) {
return someDate;
}
请求:
curl http://localhost:8080/hello/2020-02-21+12%3a15%3a45
响应:2020-02-21 12:15:45
例3. LocalDateTime作为入参(Query):
@GetMapping(value = "/hello/")
public LocalDate getTimestamp(@RequestParam LocalDate someDate) {
return someDate;
}
请求:
curl http://localhost:8080/helloTime/?someDate=2020-02-21
响应:2020-02-21
例4. LocalDateTime作为Path Query:
@GetMapping(value = "/hello/")
public Date getTimestamp(@DateTimeFormat(pattern = "yyyy-MM-dd") @RequestParam Date someDate) {
return someDate;
}
请求:
curl http://localhost:8080/helloTime/?someDate=2020-02-21
响应:2020-02-21 00:00:00
例5. Date对象作为属性序列化:
@Data
public class Student {
private Long id;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
private LocalDateTime createTime;
}
序列化后:
{
"id": "9223372036804940651",
"birthday": "2009-03-08",
"createTime": "2019-07-10 13:40:06"
}
注意:JSON序列化时,@DateTimeFormat注解换成了@JsonFormat。
BTW,id字段是Long类型,可能存在精度丢失,因此全局转为字符串。
4. 开始日期和结束日期的处理
时间范围参数可以还可以使用自定义注释@StartDate和@EndDate,前者精确到00:00:00:000,后者精确到23:59:59:999。
可以用在JSON反序列化:
public class SomeQueryParam {
@StartDate
private Date since;
@EndDate
private Date until;
}
示例:
{"since": "2020-10-01","until": "2020-10-07"}
,表示:2020年10月1日零点到2020年10月7日23点59分59秒之间的时间段,也就是2020年国庆假期。{"since": "2021-11-11","until": "2021-11-11"}
,表示:2021年11月11日零点到2018年11月7日23点59分59秒之间的时间段,2021年双十一当天的意思。
也可以直接用于接口入参:
public void initData(@StartDate @RequestParam Date since, @EndDate @RequestParam Date until);
👉最后推荐两个日期处理工具类:
- Apache Commons中的
DateUtils
- hutool中的
DateUtil
--- THE END---