2013-02-18 107 views
0

我無法理解java.sql.timestamp用夏令時分配java.sql.Timestamp

如果我運行java過時的構造函數:

java.sql.Timestamp(106,2,26,1,0,0,0) 
java.sql.Timestamp(106,2,26,2,0,0,0) 
java.sql.Timestamp(106,2,26,3,0,0,0) //<-- Separated by one hour 

我得到:發生

2006-03-26 01:00:00.0 
2006-03-26 03:00:00.0  
2006-03-26 03:00:00.0 //<--These last two are the same 

夏令(在我的國家至少)圍繞這些時間。但時間前後的日期不會移動。爲什麼兩個單獨的小時同時返回?

我想得到時間戳就像我的輸入,我該如何強制?

+2

從不使用不建議使用的構造函數開始。然後明白,由於夏令時,02:00:00和03:00:00代表同一時刻。 – 2013-02-18 14:24:53

+0

的確,似乎創建的對象(時間戳)不能在凌晨2點到凌晨3點之間取值。這在當地時間很好,但我的數據是CET(無夏令時),我需要在該時間間隔插入記錄。 – user2074921 2013-02-18 16:55:33

+0

這個計算器發佈了設置時區的說明:http://stackoverflow.com/a/10522783/445131 – 2013-03-19 13:30:00

回答

0

使用System.currentTimeMillis();爲您提供了格林尼治標準時間,它不受夏令時,閏秒和其他對日期的突然調整的影響。

long now = System.currentTimeMillis(); 

或指定手動時區:

long ms = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis(); 

來源:Get GMT Time in Java

1

,因爲它使用的默認時區不使用這個過時的構造函數,而這恰恰是過時。

使用具有適當時區(CET)的日曆(或日期格式),設置日曆的字段(或解析包含要插入日期的字符串),從日曆/日期獲取毫秒,並從毫秒中構建一個時間戳。

+0

我試過了,但問題似乎仍然存在。如果我輸入java.sql.Timestamp(1143334799999)''我得到'2006-03-26 01:59:59.999',而用'java.sql.Timestamp(1143334800000)'我得到'2006-03-26 03: 00:00.0' – user2074921 2013-02-19 11:08:44