【Java后端】日期处理约定

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---

你可能感兴趣的:(【Java后端】日期处理约定)