Java Joa/Hibernate命令按JoDA一天的时间在香港不正确工作

Java Joa/Hibernate命令按JoDA一天的时间在香港不正确工作,java,hibernate,postgresql,jpa,jodatime,Java,Hibernate,Postgresql,Jpa,Jodatime,我的问题是,当我使用order by startTime查询数据库时,startTime是Joda时间,它返回的时间是从下午4点开始的 现在下午4点正是从12点到午夜的8个小时,巧合的是我住在香港,那是我的时区,香港时区是从午夜8小时开始的。< / P> 我的startTime JPA字段是: @Index(name = "bookingStartTimeIndex") @Column(name = "start_time") @Type(type="org.joda.time.contrib.

我的问题是,当我使用order by startTime查询数据库时,startTime是Joda时间,它返回的时间是从下午4点开始的

现在下午4点正是从12点到午夜的8个小时,巧合的是我住在香港,那是我的时区,香港时区是从午夜8小时开始的。< / P> 我的startTime JPA字段是:

@Index(name = "bookingStartTimeIndex")
@Column(name = "start_time")
@Type(type="org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime")
private LocalTime startTime;
我使用JPA/Hibernate,我的查询基本上是选择*其中:

order by b.startTime asc
现在我在这个表中存储了时间从上午9点到下午6点的实体。从这个“订购人”返回的是实体从下午4点开始到下午6点,然后从上午9点到下午4点。 看来它已经决定下午4点是午夜了

这是一个postgresql数据库,当我查看我的数据库colum时,它的数据类型是time\u,而不带时区

那么我怎样才能让它在早上9点到下午6点正常订购实体呢


我发现的一个解决方法是更改为使用PersistentLocalTimeExact,这适用于 我在我提到的条件下,解决了下午4点我遇到的所有问题

@索引(name=“bookingStartTimeNumberIndex”) @列(name=“start\u time\u number”,null=true) @类型(Type=“org.joda.time.contrib.hibernate.PersistentLocalTimeExact”)
专用本地时间startTimeNumber

解决此问题的通用方法是使用表中的而不是时间。如果日期信息与您无关,您可以选择任何虚拟日期,如“2011-11-11 16:00”::下午4点的时间戳和“2011-11-11 09:00”::上午9点的时间戳

当然,也有一些方法可以用数据类型time来修复您的查询

但首先,你最初的评估可能是错误的吗?PostgreSQL将永远不会以这种方式对没有时区的时间进行排序(或者只对默认相同的时间进行排序)。您输入的时间“下午4点”正确吗?我怀疑您输入“4am”是错误的,或者您在排序之前将数据类型转换为文本

这个查询向您展示了什么

SELECT startTime FROM tbl ORDER BY startTime;

这听起来像是一个数据表示问题,而不是一个基本问题,尽管有点不清楚

您是说,对于数据库中时间为0:00小时的记录,当您从数据库中获取它时,它将显示为16:00小时?如果是这样,那么我认为在从数据库读取日期时会出现一些混乱,Hibernate extension for Joda Time中的某个地方正在创建
LocalTime
实例,假设数据库时间是UTC,然后使用本地时区创建
LocalTime
实例,从而应用-8小时的偏移量

正如Erwin所说,在数据库中存储时区是更好的方法,或者如果您不能这样做,那么只存储UTC日期和/或时间

我看了一下网站,他们建议使用Hibernate扩展,因为它比您原来使用的版本支持得更好


您还可以尝试中断
PersistentLocalTimeAsTime
类,查看
LocalTime
是如何构造的。

我可以建议您使用(免责声明:我是Usertype的作者)
相反,项目-我相信您遇到的问题正是以下链接中讨论的问题:请参见

实际上,我并没有说:
在数据库中存储时区是更好的方法
。数据类型,因为它是不明确的类型。你一定是误读了我的时间戳——我将其作为通用修复程序呈现——因为在时间点的顺序上可能存在任何混乱(同时不能保证准确的表示)。