【发布时间】:2021-02-21 14:02:58
【问题描述】:
在我的实体中,我在 MySQL 中有一个类型为 LocalDate“day”的字段,它被映射到“date”类型。
MySQL 似乎在 UTC 上运行 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 正在返回 00:00:00。我的系统正在运行 CET (UTC+1)
如果我通过 sql 查询它(来自 IntelliJ 的控制台配置了 空时区)查询
select * from table where day = '2020-10-18';
返回正确日期的条目。
使用 Spring 数据 findByDay 指定的查询看起来也正确:
2020-11-09 16:16:32.911 DEBUG 5600 --- [main] org.hibernate.SQL:从表 entity0_ 中选择 {所有字段},其中 entity0_.tag=? 2020-11-09 16:16:32.924 TRACE 5600 --- [main] o.h.type.descriptor.sql.BasicBinder:绑定参数 [1] 作为 [DATE] - [2020-10-18]
但它返回的条目 date = 2020-10-17
因此我的测试总是失败:
@Test
void getWithoutMeldebereiche() {
LocalDate of = LocalDate.of(2020, 10, 18);
List<Entity> without =
repository.findByDay(of);
assertThat(without, is(not(empty())));
assertThat(without.get(0).getTag(), is(of) ); //fails due to wrong date
}
数据源也被配置为不带时区(就像在 IntelliJ 中配置的那样):
spring.datasource.url=jdbc:mysql://localhost:3306/database?useUnicode=yes&characterEncoding=UTF8
如何使这个查询和测试独立于客户端(系统时区)服务器(数据库类型,服务器时区)(我无法控制它们)?如果我通过 IntelliJ 查询为什么它可以工作 - 也没有设置时区?
有没有比映射到“日期”的“LocalDate”更好的类型可以用于这个用例,它们是真正的日期,因此是无时区的?
到目前为止我尝试了什么: 不工作:
- spring.jpa.properties.hibernate.jdbc.time_zone=CET 没有帮助
- spring-boot.run.jvmArguments=-Duser.timezone=UTC 不工作
工作但让我依赖于目标环境中的设置:
- 在连接 url 帮助上添加 &serverTimezone=Europe/Berlin 但这在其他环境中我无法控制。这仅适用于 MySql。
- 添加
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));作品
【问题讨论】:
标签: mysql datetime time timezone spring-data