我试图将餐馆预订的日期存储在数据库中,但是,即使提交的日期是正确的,hibernate在数据库中存储的日期比我提交的日期早一天。我不知道为什么。可能是时区问题,但我不明白为什么.日期不应受时区的影响。
以下是我的spring引导属性文件:
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方法保存以存储对象。我正在使用thymeleaf来处理html模板。如果我在数据库中提交日期为30/6/2019,我将得到29/6/2019。当我按日期检索晚餐对象时,如果插入30/6/2019,就会得到日期为29/6/2019的晚餐。所以看起来春天用一种奇怪的方式来处理日期..。考虑某种时区,但我不知道如何禁用或处理它。有什么想法吗?
发布于 2020-06-29 02:00:33
yyyy-MM-dd
定义格式。LocalDate#parse默认使用DateTimeFormatter.ISO_LOCAL_DATE
,这意味着LocalDate.parse("2020-06-29")
在不显式应用格式的情况下工作。TIMESTAMP
。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 );
其中,pst
表示PreparedStatement
的对象,index
表示插入/更新查询中该字段的索引(从1
开始)。发布于 2019-12-05 04:17:37
假设您的时区是:欧洲/意大利,您必须设置您的serverTimezone变量如下:
网址: jdbc:mysql://localhost:3306/databaseName?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Italy
发布于 2020-06-26 06:15:15
同样的问题(同一个国家!:-)。
我怀疑,如果hibernate或jpa是用时区UTC
设置的,而当日期持久化时机器是用默认的时区== Europe/Rome
设置的,那么它将自动从机器时区转换为数据库时区,如果在DB上存储了所有的UTC格式的日期,这不是一个坏特性。
当您在持久化之前转换日期时会发生此问题:它会被转换两次。至少这是我的案子。
仍然在寻找最好的解决方案!如果我能找到一个,我稍后会把它加到答案中。
https://stackoverflow.com/questions/56720029
复制