【发布时间】:2020-11-20 08:35:55
【问题描述】:
我知道 stackoverflow 上已经有大量与时区相关的问题,但遗憾的是我没有找到一个描述我的问题的问题。
所讨论的实体是一个事件,其起点和终点为java.util.Date。在数据库中,这些以 UTC 格式保存为时间戳。
我目前正在尝试开发一种方法,使所有事件都在某个时间段内重叠。查询本身有效,但参数以我的本地时区而不是 UTC 发送到数据库。
public List<EventEntity> getEventsInPeriod(Date start, Date end) {
return em.createQuery("Select e from EventEntity e where e.startTime < :periodEnd and e.endTime > :periodStart", EventEntity.class)
.setParameter("periodStart", start)
.setParameter("periodEnd", end)
.getResultList();
如果在执行查询之前调用TimeZone.setDefault(TimeZone.getTimeZone("UTC")),则返回正确的结果。
我认为Date 就像一个时间戳(相对于 unix start),因此对时区不敏感。当我查看日志中的查询时,我可以看到日期在当前时区中作为字符串传递。例如:2020-08-01 15:30:00.0
【问题讨论】:
-
我不明白这个问题。您如何创建开始/结束日期对象。如果您使用“2020-08-01 15:30:00.0”创建,则此字符串将在本地时区格式化,并且不会与“2020-08-01 15:30:00.0 UTC”相同。它还可能与数据库、用于列的类型以及它的默认时区处理有关。
标签: jpa eclipselink jpql