我正在尝试将预订餐厅的日期存储在数据库中,但是,即使我提交的日期正确,休眠的日期也要比我提交的日期早一天。我不知道为什么...这可能是时区问题,但我不明白为什么...日期不应该受时区影响。
这是我的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: **********
我来自意大利,所以我的时区是:
当前,我们是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自己以一种奇怪的方式来处理日期...考虑某种时区,但我不知道如何禁用或处理它。有想法吗?
您必须像这样设置serverTimezone变量:
URL:jdbc:mysql:// localhost:3306 / databaseName?useSSL = false&useUnicode = true&useJDBCCompliantTimezoneShift = true&useLegacyDatetimeCode = false&serverTimezone = Europe / Italy