首页 > 解决方案 > REST 服务器和 Postman 之间的日期值不匹配

问题描述

我正在使用 spring 框架开发一个 REST 服务器。

我正在返回一个模型对象列表(包含日期字段的员工

所以我的模型类看起来像:

Class Employee {
 private String empId;
 private Date joinDate;
}

我的控制器方法如下所示:

@GetMapping("/Employee")
    public List<EmployeeLeaves> searchEmployeeLeaveDetails(@RequestParam(value = "filter", required = false) String filter) throws Exception {

        List<Employee> empList = service.searchEmployee(filter);

        return empList;
    }

当我试图从邮递员那里调用这个 api 作为响应时,它总是显示 joinDate 比实际日期少 1 天。

我调试了这个问题,发现在控制器中日期值是正确的

以下是测试/调试结果

Value for joinDate(Column type is Date) in Database: '2018-10-27'
Value for joinDate(java.sql.timestamp) in Controller: 2018-10-27 00:00:00.0
Value retried in postman's JSON response : "2018-10-26T18:30:00.000+0000"

任何人都知道为什么邮递员的回复显示日期为 26 而不是 27?任何与时区相关的因素介于两者之间吗?

标签: springrestdatespring-restcontroller

解决方案


您应该避免使用Date,因为它现在是一个遗留类。Java 8为基于​​ ISO 日历系统的日期、时间、瞬间和持续时间引入了新的 API 。

最接近的等价物DateInstant表示时间戳,即 UTC 时间线上的时刻。但您可能想OffsetDateTime改用它,因为它存储所有日期和时间字段以及与 UTC/格林威治的偏移量。

引用OffsetDateTime类文档:

它旨在ZonedDateTimeInstant用于在更简单的应用程序中对数据进行建模。此类 [ OffsetDateTime] 可以在更详细地建模日期时间概念时使用,或者在与数据库或网络协议通信时使用。


推荐阅读