2016-04-24 161 views
1

我打電話我rest API使用以下網址localhost:8080/api/2016-05-30T10:30:00-05:00/3日期時間到的java.sql.Timestamp轉換添加1小時

的API接收dateString,然後將其轉換成jodatime DateTime對象像dateTime = DateTime.parse(date); ...調試此代碼顯示其產生的預期價值。

然而,當我將這個日期java.sql.timestampTimestamp ts = new Timestamp(dateTime.getMillis()); ...產生的時間是2016-05-30 11:30:00.0 ...爲什麼它添加+1 hour的時間和什麼適當的方式轉換?

一些背景

我已保存的時間在SQL表時間戳。與時區(例如字符串+4:00或-5:00)在一個單獨的列中。

我將在我的url路徑參數中收到一個ISO8601時間,並基於此我必須從db中獲取記錄。爲此,我將使用兩個比較。 1匹配時間,2匹配時區。

+1

您可能想要包含有關時區的信息。它可能經常有...有趣的副作用。 – Matthieu

+0

我應該添加什麼信息?我沒有做任何明確的說每...我的系統設置爲美國東部時區雖然 –

+0

我不熟悉jodatime,但'java.sql.Timestamp(長)'期望參數在GMT時區,我不會沒有看到['BaseDateTime.getMillis()'javadoc] [http://joda-time.sourceforge.net/apidocs/org/joda/time/base/BaseDateTime.html#getMillis%28%29]中指定的任何時區),雖然它似乎使用ISO8601,其中Z意味着UTC,這相當於GMT ... – Matthieu

回答

1

ISO 8601指出

...在冬季在紐約的時間是UTC-05:00

如此看來daylight saving time列入日期字符串,這意味着您獲得的是正確的時間,按照定義的時區(-05:00)。紐約夏天時間應-04:00,因爲DST是不是ISO的一部分,8601

你可以在你的數據庫添加額外DST列或將其添加爲參數,或經過檢查你是否是過程在不同的國家(如卡塔爾不使用它)和逐年(如俄羅斯幾年前已放棄DST)的DST,所以它不是一個可行的選擇...

編輯: 另一種選擇將用於測試時區當前是否在DST中,如another answer中所示。然後您可以應用-1h偏移量。

請注意,如果inDaylightTime()返回true,Joda有minusHours()方法可以使用。