2016-05-16 29 views
0

我正在使用Java的java.sql.timestamp和java.util.date在Oracle的不同表中存儲時間。所有的Oracle列都是時間戳。Java時間戳在Oracle中存儲12位不同情況下的怪異行爲時間戳

保存12:02 PM時間(12:00至12:59 PM之間的時間)時出現問題。在一些表中它存儲正確的,在它的一些錯誤,即12:02

這裏有情況:

1)在java中:

java.sql.TimeStamp timestamp = new Timestamp(new Date().getTime()); 

以上新的Date()返回 - 「 Mon May 16 12:02:02 EST 2016「

Oracle列映射僅包含Timestamp。在此特定表中,它將Oracle時間戳存儲爲 - >「16/MAY/16 12:02:02.000000000 AM」。 這是錯誤的,因爲它應該是PM而不是AM,因爲在中午執行的交易是 。

在上表中,Oracle中的所有時間戳都有尾隨000000000毫秒。

2)在Java:

java.sql.TimeStamp timestamp2 = new Timestamp(new Date().getTime()); 

以上新的Date()返回 - 「週一5月16日12時51分01秒EST 2016」

Oracle列映射只有時間戳。在此特定表中,它將Oracle時間戳存儲爲 - >「16/MAY/16 16/MAY/16 12:51:01.170000000 PM」。這是正確的,因爲它應該只是PM。 在上面的表格中,Oracle中的所有時間戳都有一些值,以ms爲單位。

3)在Java

Date date = new Date(); 

專賣店在甲骨文timestamp列直接日期和工作正常。它在Oracle列中存儲 「16/MAY/16 12:02:03.446000000 PM」。

我不明白爲什麼時間戳的使用有這樣的差異。

我正在使用Hibernate在數據庫中插入對象。

任何人都可以請在這裏幫忙嗎?

感謝 尼廷

+0

你如何將它插入數據庫?你是否將它作爲綁定參數傳遞?或者作爲一個字符串使用動態SQL? – MT0

+0

顯示錯誤時間的列是實際日期而不是時間戳嗎?我知道你說他們都是時間戳,但這似乎並不完全正確 - 失去秒數表明他們可能並不全是。或者是一些簡單的時間戳,其他都與時區或當地時區?如果是這樣,你可以檢查會話的NLS設置 - 我懷疑有一個隱式轉換或轉換從12小時轉換爲24小時格式。但是,您的實際NLS值將有助於正確解釋。 –

+0

@ MT0:我使用Hibernate進行數據庫插入。 –

回答

0

我對你的代碼的正確性懷疑。沒有java.util.Timestamp類,而是java.sql.Timestamp。而「12:02 PM」對我來說沒有意義(實際上是第二天的「00:02 AM」)。

您應該首先明確區分時間戳值的內部格式與其字符串表示形式(雙方:java和oracle)。

也許你的問題是基於你不考慮時間戳的時區(時間戳不)的事實。 java Timestamp類不處理時區,它只包含一個抽象的long,表示自1970年1月1日以來的毫秒數。您的println使用您當前的語言環境(「EST」)進行字符串渲染。使用另一個區域設置,您可以獲得不同的小時值。

Oracle本身提供了一個數據類型「TIMESTAMP WITH TIME ZONE」。

如果您使用的是java 8,我強烈推薦使用新的Date API,它處理時區周圍的所有奇怪的東西。此外,我建議將所有時間戳值標準化爲以GMT時區(即時區0)表示的時間戳,以編程方式保存並以此標準化格式傳輸時間戳,並僅在人類輸入rsp上傳輸時間戳。當爲人類閱讀器呈現時間戳時,應考慮格式和時區。

+0

我剛糾正了我的問題。它的java.sql.Timestamp。 而且我不能使用Java 8.只在項目中使用Java 6。在oracle列中,存儲12:02 AM。不知道這個價值會如何。 –