使用QueryDSL,如何在不同时区比较两个Joda DateTimes(在Postgres中使用JPA和Jadira持久化)?

时间:2016-01-14 18:34:26

标签: jpa timezone jodatime querydsl

我正在尝试使用Querydsl比较存储在不同时区(例如纽约时间下午2点和芝加哥时间下午1点)的相同日期,但在将日期保持为Joda Time org.joda.time.DateTime时遇到问题,在{{1}持续存在时效果很好但是。这是实体类,它的相关部分:

java.util.Calendar

public class AvailabilityCalendarEvent { @Basic(optional = false) @Columns(columns = { @Column(name = "end_time"), @Column(name = "end_time_zone") }) @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTimeWithZone") private org.joda.time.DateTime end; @Temporal(javax.persistence.TemporalType.TIMESTAMP) private java.util.Calendar start; // omitted code } 字段是日历,start是日期时间。这个测试在芝加哥持续一段时间,然后尝试在纽约使用相同的时间(在1小时内计算时区差异),按预期工作。

end

此测试与开始日期测试完全相同,除了它比较使用@Test public void testDateEqualityUsingCalendar() { Calendar chicagoTime = new DateTime(2016, 1, 13, 15, 0, 0, DateTimeZone.forID("America/Chicago")).toCalendar(null); AvailabilityCalendarEvent chicagoCalendarEvent = new AvailabilityCalendarEvent(); chicagoCalendarEvent.setStart(chicagoTime); calendarEventRepository.save(chicagoCalendarEvent); Calendar laTime = new DateTime(2016, 1, 13, 13, 0, 0, DateTimeZone.forID("America/Los_Angeles")).toCalendar(null); ArrayList<CalendarEvent> retrievedCalendarEvents = Lists.newArrayList(calendarEventRepository.findAll(QCalendarEvent.qCalendarEvent.start.eq(laTime))); assertEquals(1, retrievedCalendarEvents.size()); // Passes } 存储的结束日期,它失败。

DateTime

任何想法为什么会发生或如何解决?

另外,我确认做了一本手册&#39;当时间戳和时区连接时,对那些相同的DateTime日期进行SQL比较:

@Test public void testDateEqualityUsingDateTime() { DateTime chicagoTime = new DateTime(2016, 1, 13, 15, 0, 0, DateTimeZone.forID("America/Chicago")); AvailabilityCalendarEvent chicagoCalendarEvent = new AvailabilityCalendarEvent(); chicagoCalendarEvent.setEnd(chicagoTime); calendarEventRepository.save(chicagoCalendarEvent); DateTime laTime = new DateTime(2016, 1, 13, 13, 0, 0, DateTimeZone.forID("America/Los_Angeles")); ArrayList<CalendarEvent> retrievedCalendarEvents = Lists.newArrayList(calendarEventRepository.findAll(QCalendarEvent.qCalendarEvent.end.eq(laTime))); assertEquals(1, retrievedCalendarEvents.size()); // Fails }

0 个答案:

没有答案