2011-02-28 49 views
0

我有一个Postgres DB,其中有一列名为t_time的类型为timestamp with time zonePostgreSQL和Hibernate:如何格式化时间戳输出?

当我使用psql工具来查看列的内容,我得到的,例如:

select t_time from table1 where ... 

     t_time  
--------------------- 
2011-02-28 14:09:25 
2011-02-28 14:09:23 

这就是我想要的格式。

然而,当我通过我的Java代码,它使用Hibernate运行相同的选择查询,我得到如下:

2011-02-28 14:09:25.0 
2011-02-28 14:09:23.0 

正如你所看到的,在最后一个点和零添加。

我的问题是 - 如何指定我想要使用的格式?

更改查询,例如像这样,

select to_char(t_time, 'YYYY-MM-DD HH24:MI:ss') as t_time from table1 where ... 

是可能的,但不期望的,因为我在代码的数据查询几个地方,我不希望改变他们每个人,我希望这个定义是全系统的。

感谢您的帮助。


编辑:

我想添加一个澄清:当我写到这,我想编辑映射文件的方向。我认为可能有一种方法来定义那里的格式。这意味着只能在一个地方改变,而不是依靠任何默认格式。

谢谢。

+0

什么是hibernate java数据类型+映射信息? – 2011-02-28 14:05:24

+0

你很乐意改变你的postgres模式,因为你不想改变你的代码? – 2011-02-28 14:25:55

+0

@Heiko Rupp:java数据类型是'Timestamp'。 – Dikla 2011-03-01 06:51:53

回答

3

我认为使用日期格式化程序总是一个好主意。

Date t_time = table1Entity.t_time; 
String t_time_str = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(t_time); 
+0

这个问题说:“我有一些地方在查询数据的代码,我不希望改变他们每个人” – 2011-02-28 14:20:50

+0

@JackPDouglas:感谢您的提示。我忽略了这一点。但是,对于那些忽视这一点的人来说,答案也许会有所帮助。 ;-) – splash 2011-02-28 14:26:08

+0

足够了:-) – 2011-02-28 14:47:14

1

是可能的,但不期望的,因为我在代码的数据查询几个地方,我不希望改变他们每个人,我想定义为系统-宽。

您的数据库中有一个时间戳(非varchar)。你的Java中有一个“时间戳”(非字符串,可能是日期或日历)。不同之处在于客户端向您提供的字符串/文本表示,不管是psql,还是Java对象的“toString()”方法。如果您使用了不同的数据库客户端,我敢打赌输出将是第三种变体:-)

我的观点是:您不应该依赖日期的字符串表示(或任何其他非String对象, )。如果你的任何代码依赖于此,我会说这是错误的。期。

如果您需要触摸多个文件以更改最终用户的文本日期显示方式,那么我会说您有机会在那里进行更改:将日期格式外化并释放您的代码来自“固定”配置。

简而言之:使用飞溅的方法。

+0

我想过改变映射以包含格式,所以我不会依赖任何默认表示。有这样的选择吗? – Dikla 2011-03-01 06:57:23

+0

Java中时间戳的正确表示形式是Date或Calendar对象。为数据库时间戳映射字符串表示并不理想。但是如果你真的需要这个,你可以创建你的UserType并告诉Hibernate使用它,而不是处理时间戳的默认类型。 – jpkrohling 2011-03-01 14:42:22

+0

我该怎么做?你有链接或其他信息?谢谢! – Dikla 2011-03-02 06:33:45