2011-02-28 80 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