2013-02-05 54 views
1

我需求量的是這樣的:Java的時區:爲什麼偏移需要

我節省了時間,在數據庫毫秒和timezone.For例子milisecond的時間長1223123123232和時區爲Asia/Calcutta。我必須將它轉換爲Africa/Asmara時區。

long l = 1223123123232l; 
TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta"); 
long tzOff = tz.getOffset(l); 
java.util.Date d = new Date(l-tzOff); // WHY THIS?? 
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z"); 
df.setTimeZone(TimeZone.getTimeZone("Africa/Asmara"));// required timezone 
String s = df.format(d); 
System.out.println(s); 

要檢查我指這樣的:link

我的問題是:

  1. 如果時區是在不同的格式,只是時間表示(地理區域從GMT偏移量),爲什麼我是否需要從實際時間減去偏移時間(l-tzOff)
  2. 爲什麼我不能忽略保存在數據庫中的時區,只考慮我想轉換日期的時間?

喜歡的東西:

long l = 1223123123232l; 
java.util.Date d = new Date(l); 
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z"); 
df.setTimeZone(TimeZone.getTimeZone("Africa/Asmara"));// required timezone 
String s = df.format(d); 
System.out.println(s); 

我的系統時區爲Asia/Calcutta,我想一個日期在Africa/Bujumbura時區轉換爲Europe/Vatican timezone.The上面的代碼是不是在這種情況下工作?爲什麼這樣呢?

回答

1

Java dates do not know about time zones。因此,如果我在紐約節省14H00,它將不會與巴黎14H00一樣,儘管毫秒值是相同的。您需要使用唯一的參考來保存日期。人們通常選擇GMT + 0。

如果您需要檢查跨時區的本地時間,可以使用我開發的工具here

回答您的問題:

  1. 時區是不是時間的表現,它是時間的定位。您將減去偏移量的原因是爲了確保所有時間都根據相同的參考定義。
  2. 因爲你會得到錯誤的結果和錯誤的日期。
+0

主席先生,我的默認時區是'亞洲/加爾各答'。我想將「利比亞」時區的日期轉換爲「非洲/布瓊布拉」。上面的代碼我粘貼的是沒有給出正確的結果? –

+0

不可以。您應該使用我在答案開始處發佈的鏈接中提供的代碼示例。請參閱「在時區之間轉換日期」部分。 – JVerstry

1

new Date(long)花費由於GMT劃時代的毫秒數。因爲在你的情況下,l是自某個其他時間點(即1970年1月1日,亞洲/加爾各答的00:00:00)以來的毫秒數,因此必須先將其轉換爲GMT。這是通過減去相關的時區偏移來完成的。

+0

thnx爲答覆先生,但是,如果我沒有錯,只有一個時代。 –

+0

@RiteshKaushik:的確如此。然而,你的'l'不是從曆元的偏移量,而是其他時間點的偏移量,你需要對此進行修正。 – NPE

+0

先生,我的默認時區是'亞洲/加爾各答'。我想將「利比亞」時區的日期轉換爲「非洲/布瓊布拉」。上面的代碼我粘貼的是沒有給出正確的結果? –