java Sping Boot 返回错误日期

2izufjch  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(203)

我有一个实体人

@Entity
@Data
public class Person {

  @Temporal(TemporalType.DATE)
  private Calendar dob;
}

还有一些dao类

@Data
public class PersonResponse {

  @JsonFormat(pattern = "yyyy-MM-dd")
  private Calendar dob;
}
@Data
public class PersonRequest{
  @DateTimeFormat(pattern = "yyyy-MM-dd")
  private Calendar dob;
}

当存储值时,它工作得很好。例如,如果我发送“2000-01-01”,它会存储在数据库“2000-01-01”中。但是当我试图归还它时,我得到了“1999-12-31”。
现在很明显这是一个***时区问题***,但我不知道如何解决它。

我对原因的解释

用户的时区是GMT+1,所以它被检索为“2000-01- 01 T00:00:00.000 +01:00”,然后被解析为UTC“1999-12- 31 T23:00:00.000 +00:00”,最后被返回为“1999-12-31”。
但是为什么呢?我知道用户的时区可以改变,我该如何防止这种情况发生(所以手动添加1小时的时间偏移是不起作用的)。
我还尝试将类型从Calendar更改为java.util.Date和java. sql. Date。但没有结果。
类似的问题在以前被问过,比如this one,但我仍然不明白如何修复它

cidc1ykv

cidc1ykv1#

如果适用,尝试从Calendar类切换到LocalDate类。LocalDate不考虑时区。这将解决您的问题(并简化您的代码)。另外,要使用Json格式化LocalDate,请参阅此问题的答案:Spring Data JPA - ZonedDateTime format for json serialization

dbf7pr2w

dbf7pr2w2#

你面临的问题确实与时区有关。当您在数据库中存储dob值时,它存储为提供的确切日期和时间。但是,当您检索它时,会发生时区转换,导致日期显示不同。尝试使用TimeZone.setDefault(TimeZone.getTimeZone("UTC"));并设置spring.datasource.url:jdbc:mysql://127.0.0.1:3306/database?serverTimezone=UTC

相关问题