2017-07-31 83 views
0

我有一个Hibernate的Spring Boot应用程序。服务器时区是UTC。我需要用DST(夏令时)来使用欧洲/伦敦。我设置了在启动时:LocalDateTime时区工作,而LocalTime不工作

TimeZone.setDefault(TimeZone.getTimeZone("Europe/London")); 

而且与MySQL

datasource: 
    type: com.zaxxer.hikari.HikariDataSource 
    url: jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&useTimezone=true&serverTimezone=Europe/London 
    name: 
    username: **** 
    password: **** 
    hikari: 
     data-source-properties: 
      cachePrepStmts: true 
      prepStmtCacheSize: 250 
      prepStmtCacheSqlLimit: 2048 
      useServerPrepStmts: true 
      hibernate.jdbc.time_zone: Europe/London 

我不希望我的时间更改为UTC连接。我需要留在DST,就是这样。我的申请仅适用于英国,所以欧洲/伦敦足够好。

问题是,当我有LocalDateTime例如:31.07.2017 14:00并将其存储到数据库,然后我在数据库中具有完全相同的条目。但是,当我在14:00存储LocalTime(单独)时,它会在13:00保存在数据库中。为什么它在现场转换的时间?

UPDATE:

更多的调试后(加入两行application.properties):

logging.level.org.hibernate.SQL=debug 
logging.level.org.hibernate.type.descriptor.sql=trace 

我看到Hibernate不转换时间。它发送了14:00,但MySQL将它转换为13:00。有什么建议么?

回答

0

根据​​,LocalTime.now()应检查当前TimeZone。我只和Hibernate一起工作过一次,并且完全混淆了事情的规则和顺序(我的错误!)。我建议你使用LocalTime now(ZoneId.of("Europe/London"))。因此,你会独立于其他任何东西。

我希望它有帮助。

+0

谢谢@rlinden。这看起来像是MySQL单独改变数值。我有连接参数serverTimezone =欧洲/伦敦强制使用欧洲/伦敦和它适用于DATETIME但不适用于时间。我的意思是,MySQL对DATETIME不做任何处理,但在TIME字段中更改值。我需要欧洲/伦敦的“CURRENT_TIMESTAMP”等。 – psalkowski