Java日期处理最能体现团队成熟度,之前有那么个项目,有的童鞋用Date
,有的用LocalDateTime
,还有的用Long
,有的直接用String
,真是百花齐放,百鸟争鸣,百思不得其解啊~~
所以有必要从前后端接口角度约定以下日期处理方式。
大家都知道,Date/LocalDateTime序列化成JSON时默认使用国际标准时间格式(ISO8601),对于开发者不是特别友好,现全局统一配置日期格式如下:
对象 | 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---