2011-12-20 127 views

回答

11

java.sql.Timestamp物體沒有時區 - 它們是時間的瞬間,如java.util.Date

如果您認爲他們在特定的時區,您可能會因誤導性輸出而感到困惑(例如,使用默認時區自動將該時刻轉換爲本地時間)或者您可能有以不恰當的方式創建數據。你需要的答案將取決於你的情況的細節。

例如,如果你只是想顯示在特定時區中的Timestamp值,則可以使用SimpleDateFormat,適當地設置時區,只是格式化Timestamp(因爲它延伸Date)。我不相信這會讓你顯示與內部時間戳存儲一樣精確的數據,但可能不會對你造成問題。

如果您的數據已被錯誤地創建爲那麼可能有也可能沒有辦法「更正」它 - 例如,由於夏令時更改可能存在一些不明確之處。然而,我們越瞭解它越好,我們就能幫助你。

+2

謝謝,喬恩的答案,但有使用getTimezoneOffset(),在時間戳的方法已過時,它返回從格林尼治標準時間以分鐘爲單位的偏移量,在我的情況下,它返回到360分鐘。期望的結果是將其更改爲0,這將是GMT時間戳的情況。 – abson 2011-12-21 11:36:49

+0

@abson:'getTimezoneOffset'繼承自'Date' - 它總是*相對於系統默認時區。它根本不屬於對象的一部分,不應該使用。 – 2011-12-21 11:42:40

+3

時區偏移量肯定會影響結果。我在數據庫中有兩個時間戳。一個在DST之前,一個在DST之後。如果我使用Timestamp的getTime()作爲其構造函數參數創建Calendar對象,那麼對於之前的DST時間戳而不是DST之後的時間戳可以。儘管使用Calendar.getInstance(TimeZone.getTimeZone(「UTC」))來實例化Calendar對象,但它錯誤地將其「糾正」了一個小時 – 2013-04-04 10:43:15

1

某些Timestamp構造函數的確依賴於默認的時區。爲了避免這種 一種方法是使用需要很長的構造:

TimeZone.setDefault(TimeZone.getTimeZone("GMT")) 
Timestamp.valueOf("2016-10-26 23:00:00").getTime() 

res16: Long = 1477522800000 // This is what we want 

TimeZone.setDefault(TimeZone.getTimeZone("GMT-1")) 
Timestamp.valueOf("2016-10-26 23:00:00").getTime() 

res14: Long = 1477526400000 

new Timestamp(OffsetDateTime.of(2016,10,26,23,0,0,0,ZoneOffset.UTC).toInstant.toEpochMilli).getTime 

res15: Long = 1477522800000 // We get the same result at in GMT