2012-02-23 59 views
6

我想將LocalTime對象轉換爲java.sql.Time對象。將joda LocalTime轉換爲sql時間

java.sql.Time time = new java.sql.Time(new LocalTime(1,0,0,0).getMillisOfDay()); 
System.out.println(time); //20:00:00 

上述代碼不是創建一個值等於01:00:00的Time對象,而是創建一個時間爲20:00:00的對象。當地時間是東部時間。

我應該採取哪些措施?

回答

6

Time(..)接受從1970年開始時間戳所以,你應該傳遞:

new Time(new LocalTime(...).toDateTimeToday().getMillis())

6

我認爲目前公認的答案是不正確的。儘管java.sql.Time意味着它的日期字段被設置爲1970-1-1,但這不是事實。如果使用轉換

new java.sql.Time(new LocalTime(...).toDateTimeToday().getMillis()) 

那麼java.sql.Time對象的內部millesecond表示形式將反映今天的日期。這在比較java.sql.Time對象時會導致意外行爲。 在毫秒值上執行比較,如果底層日期不同,則時間域與比較結果無關

更好的方法是使用不推薦使用的構造函數和方法顯式使用時間域在java.sql.Time中:

LocalTime localTime = new LocalTime(1,0,0,0); 
java.sql.Time sqlTime = new java.sql.Time(localTime.getHourOfDay(), localTime.getMinuteOfHour(), localTime.getSecondOfMinute()) 

類似地,在另一個方向上

java.sql.Time sqlTime = new java.sql.Time(1,0,0); 
LocalTime localTime = new LocalTime(sqlTime.getHours(), sqlTime.getMinues(), sqlTime.getSeconds()); 
+2

使用不贊成的方法是不好的做法。 – pgerstoft 2013-07-02 18:47:37

+3

當然,但你必須知道什麼時候打破規則。這些被棄用的方法是實現該目標的最簡單和最有效的方法,並且在可預見的將來沒有計劃將它們從Java中移除。坦率地說,孫永遠不應該棄用他們;那些替代他們的可怕混亂是整個理由轉向像JodaTime這樣的更清晰的實現。 – 2013-07-04 13:26:09

0

這似乎是在約達時間API中的孔。現在getLocalMillis()protected,但這正是我想要使用的方法。

但是,如果你想避免過時的方法,可以計算出時間1970年1月1日:

LocalTime lt = new LocalTime(1, 23, 45, 678); 
long millis = lt.toDateTimeToday().withDate(1970, 1, 1).getMillis() 
java.sql.Time time = new java.sql.Time(millis); 

這似乎是工作。有趣的是,我試圖通過將場的值相乘來計算出毫米數。這產生了正確的long值,但是當我將它傳遞給Time構造函數時,這個時區出現了一些奇怪的情況。 (我認爲,至少Time價值結束了我通過的價值前五小時,而我在東部夏令時,所以我認爲這就是發生了什麼。)

0

我發現了另一種方法來轉換java.time.LocalTimejava.time.LocalTime

LocalTime localTime = LocalTime.now(); 
Time time = Time.valueOf(localTime); 
+0

問題是關於Joda-Time中的LocalTime,而不是Java 8中添加的LocalTime類。 – 2017-04-05 14:04:07

相關問題