休眠时存储的错误LocalDate

问题描述 投票:0回答:1

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

这是我的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 +夏令时2h

当前,我们是UTC + 2h。

我要存储的对象是这个对象:

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

    private LocalDate date;
    ...

我用来拦截POST请求的控制器是这样的:

@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来存储对象。我正在使用百里香处理html模板。如果我在数据库中提交日期30/6/2019,则会得到29/6/2019。当我按日期检索Dinner对象时,如果插入30/6/2019,则会得到日期为29/6/2019的Dinner。因此,似乎Spring自己以一种奇怪的方式来处理日期...考虑某种时区,但我不知道如何禁用或处理它。有想法吗?

spring hibernate jpa thymeleaf localdate
1个回答
-1
投票

您必须像这样设置serverTimezone变量:

URL:jdbc:mysql:// localhost:3306 / databaseName?useSSL = false&useUnicode = true&useJDBCCompliantTimezoneShift = true&useLegacyDatetimeCode = false&serverTimezone = Europe / Italy

© www.soinside.com 2019 - 2024. All rights reserved.