为什么日期值会在每个PUT上跳回1天?

时间:2016-05-25 08:02:12

标签: java json postgresql rest date

问题

在每次REST更新中,日期都会在给定日期前一天存储。

症状

当我PUT {'start': '2016-05-25', ...}然后GET我得到{'start': '2016-05-24', ...}

当我PUT {'start': '2016-02-12', ...}然后GET我得到{'start': '2016-02-11', ...}

它应该返回相同的日期。

应用程序

我有一个Java Spring Rest Controller,它接收JSON数据。

  • method = PUT
  • endpoint ='/ term'
  • body data = {'start':'2016-05-25',...}

此对象在DTO类中表示:

public class TermDTO {

    @JsonProperty("start")
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd", timezone="Europe/Amsterdam")
    private Date startDate;

}

然后将此DTO对象映射到某处的Entity对象:

public class TermEntity {

    @Column(name="start_date")
    @Temporal(TemporalType.DATE)
    private Date startDate;

}

映射:

public TermEntity map(TermDTO termDto){
    ...
    termEntity.setStartDate(termDto.getStartDate());
    ...
    return termEntity;
}

稍后使用此定义将其保存到PostGreSQL数据库:

-- term table
CREATE TABLE term (
  ...
  start_date         DATE,
  ...
);

现在,奇怪的是这种行为只发生在服务器上,而不是发生在我的本地开发环境中。 这可能是由该服务器上的不同时区(UTC而不是欧洲/阿姆斯特丹)引起的。 我希望这与时区有关。也许我需要在整个过程中明确定义时区。 或者我应该使用其他Java日期类型? 我真的想在应用程序中而不是在服务器上设置它(设置它的时区)。

这似乎很难调试,因为它不会在我的机器上发生。 我希望你有一个建议。

0 个答案:

没有答案