gpt4 book ai didi

spring - hibernate 时存储的 LocalDate 错误

转载 作者:行者123 更新时间:2023-12-05 07:21:54 24 4
gpt4 key购买 nike

我试图在数据库中存储餐厅预订的日期,但是,即使我提交的日期是正确的,hibernate 在数据库中存储的日期比我提交的日期早一天。我不知道为什么...这可能是时区问题,但我不明白为什么...日期不应受时区影响。

这是我的 spring boot 属性文件:

spring:
thymeleaf:
mode: HTML5
encoding: UTF-8
cache: false
jpa:
database: MYSQL
hibernate:
ddl-auto: update
properties:
hibernate:
locationId:
new_generator_mappings: false
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
jdbc:
time_zone: UTC
datasource:
driver:
class: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/databaseName?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: username
password: **********

我来自意大利,所以我的时区是这样的:

  • GMT/UTC + 标准时间 1 小时
  • GMT/UTC + 夏令时 2 小时

目前我们是 UTC + 2h。

我存储的对象是这个:

@Entity
public class Dinner {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long dinnerId;

private LocalDate date;
...

我用来拦截 POST 请求的 Controller 是这样的:

@PreAuthorize("hasRole('USER')")
@PostMapping
public String createDinner(@RequestParam(value="dinnerDate") String dinnerDate, Principal principal, Model model){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse(dinnerDate, formatter);
dinnerService.createDinner(date);
return "redirect:/dinners?dinnerDate=" + dinnerDate;
}

调用服务方法 createDinner 调用 Jpa 方法 save 来存储对象。我正在使用 thymeleaf 来处理 html 模板。如果我在数据库中提交日期 30/6/2019,我会得到 29/6/2019。当我按日期检索晚餐对象时,如果我插入 30/6/2019,我将获得日期为 29/6/2019 的晚餐。因此,spring 似乎以一种奇怪的方式自行处理日期……考虑到某种时区,但我不知道如何禁用或处理它。有什么想法吗?

最佳答案

  1. 您不需要为模式 yyyy-MM-dd 定义格式。 LocalDate#parse默认情况下使用 DateTimeFormatter.ISO_LOCAL_DATE,这意味着 LocalDate.parse("2020-06-29") 无需显式应用格式即可工作。

  2. 由于您已经知道您所在时区的日期时间与 UTC 中的日期时间不同,因此您永远不应该只考虑日期;相反,您应该同时考虑日期和时间,例如UTC 时间 2020-06-29 的晚上 11:30 将落在您所在时区的 2020-06-30。因此,您应该做的第一件事是在数据库中将字段类型更改为TIMESTAMP

  3. 将字段类型更改为 TIMESTAMP 后,更改方法 createDinner,如下所示:

    LocalDateTime dinnerDateTime = LocalDateTime.of(LocalDate.parse(dinnerDate), LocalTime.of(0, 0, 0, 0));
    OffsetDateTime odt = dinnerDateTime.atOffset(ZoneOffset.UTC);
    dinnerService.createDinner(odt);

    然后在 DinnerService(或 DinnerServiceDAO 中,无论您在何处编写了在数据库中插入/更新记录的逻辑):

    pst.setObject(index, odt);

    其中pst代表PreparedStatement对象,index代表这个对象的索引(从1开始)插入/更新查询中的字段。

关于spring - hibernate 时存储的 LocalDate 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56720029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com