美文网首页
【Java后端】日期处理约定

【Java后端】日期处理约定

作者: iakuil | 来源:发表于2022-06-16 15:59 被阅读0次

    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后端】日期处理约定

          本文链接:https://www.haomeiwen.com/subject/xbdqvrtx.html