2013-04-13 142 views
2

我想獲取當地時間,當它是在不同時區的午夜時。 我的意思是:在其他時區獲取當地時間午夜時間

  • 什麼時間在斯德哥爾摩,在倫敦午夜的時候?
  • 在斯德哥爾摩,在赫爾辛基的午夜時分,現在幾點鐘?

這裏是我的代碼有

public static void main(String[] args) throws ParseException { 
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    formatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm")); 
    Date date = formatter.parse("2013-04-13 00:00:00.000"); 

    System.out.println("London: " + formatter.format(getFirstInstantOfDay("Europe/London", date))); 
    System.out.println("Helsinki: " + formatter.format(getFirstInstantOfDay("Europe/Helsinki", date))); 
} 

public static Date getFirstInstantOfDay(String timeZoneId, Date date) { 
    Calendar resultDate = Calendar.getInstance(TimeZone.getTimeZone(timeZoneId)); 
    resultDate.setTime(date); 
    resultDate.set(Calendar.HOUR, 0); 
    resultDate.set(Calendar.MINUTE, 0); 
    resultDate.set(Calendar.SECOND, 0); 
    resultDate.set(Calendar.MILLISECOND, 0); 
    return resultDate.getTime(); 
} 

輸出是:

London: 2013-04-12 13:00:00.000 
Helsinki: 2013-04-12 23:00:00.000 

而且我預計:赫爾辛基不出所料

London: 2013-04-13 01:00:00.000 
Helsinki: 2013-04-12 23:00:00.000 

的結果,但對於倫敦來說,這是一個瘋狂的結果,我不明白它來自哪裏。

----- -----編輯

最終代碼與預期輸出:

String dateStr = "2013-04-13"; 

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
formatter.setTimeZone(TimeZone.getTimeZone("Europe/London")); 
Date dateGB = formatter.parse(dateStr); 
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm")); 
Date dateSE = formatter.parse(dateStr); 
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Helsinki")); 
Date dateFI = formatter.parse(dateStr); 

DateFormat stockholmFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
stockholmFormatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm")); 


System.out.println("Midnight in London is " + stockholmFormatter.format(dateGB) + " in Stockholm."); 
System.out.println("Midnight in Stockholm is " + stockholmFormatter.format(dateSE) + " in Stockholm."); 
System.out.println("Midnight in Helsinki is " + stockholmFormatter.format(dateFI) + " in Stockholm."); 

輸出:

Midnight in London is 2013-04-13 01:00:00.000 in Stockholm. 
Midnight in Stockholm is 2013-04-13 00:00:00.000 in Stockholm. 
Midnight in Helsinki is 2013-04-12 23:00:00.000 in Stockholm. 
+0

爲什麼從頭開始解析斯德哥爾摩時區的日期?這對我來說沒有意義。顯然你正在使用'HOUR'字段,你應該使用'HOUR_OF_DAY'。 –

+0

那麼它對你有什麼意義? – Oliveira

+2

難道你不想首先在另一個時區選擇特定日期的午夜,然後在你的時區重新解釋那個時刻嗎?你現在正在做的是沒有達到這個目標。 –

回答

1

您與stockolm時區解析日期:

formatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm")); 

,你解析到倫敦的時區和赫爾辛基結果日期:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
formatter.setTimeZone(TimeZone.getTimeZone("Europe/London")); 
Date date = formatter.parse("2013-04-13 00:00:00.000"); 
System.out.println("London: " + formatter.format(getFirstInstantOfDay("Europe/London", date))); 
System.out.println("Helsinki: " + formatter.format(getFirstInstantOfDay("Europe/Helsinki", date))); 

結果是:

London: 2013-04-13 00:00:00.000 
Helsinki: 2013-04-12 22:00:00.000 

請注意,您的格式有HH是指小時,從0到23

*編輯*

爲了獲得在倫敦,斯德哥爾摩和赫爾辛基時間:

formatter.setTimeZone(TimeZone.getTimeZone("Europe/London")); 
Date date = formatter.parse("2013-04-13 00:00:00.000"); 

System.out.println("London: " + formatter.format(date));      
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm")); 
System.out.println("Stockolm: " + formatter.format(date)); 
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Helsinki")); 
System.out.println("Helsinki: " + formatter.format(date)); 

而輸出爲:

London: 2013-04-13 00:00:00.000 
Stockolm: 2013-04-13 01:00:00.000 
Helsinki: 2013-04-13 02:00:00.000 
+0

我希望輸出在斯德哥爾摩時區,而不是倫敦時區。當然,倫敦午夜時分是午夜。但在斯德哥爾摩凌晨1點,倫敦午夜時分,這就是我想要得到的。 – Oliveira

+0

我編輯迴應。 – Joan

3

嘗試更改小時HOUR_OF_DAY。它似乎是一次讀取AM的時間,一次是PM。

更多信息: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html

+0

HOUR_OF_DAY修復了小時問題,但當天仍然是12,應該是13:「London:2013-04-12 01:00:00:00」 – Oliveira

+0

嘗試編輯您的代碼,如下所示: http:// stackoverflow。 com/questions/7670355/convert-date-time-for-given-timezone-java – Xyzk

2

Calender具有了當天的小時兩種方式。

第一種方式是通過HOUR_OF_DAY

resultDate.set(Calendar.HOUR_OF_DAY, 0); 

第二個選項是通過 '一小時' 和 'AM_PM'

resultDate.set(Calendar.HOUR, 0); 
resultDate.set(Calendar.AM_PM,Calendar.AM); 

編輯: 您獲得2013-04事實-12是正確的。

您進入2013年4月13日00:00:斯德哥爾摩

這是同一時間,2013年4月12日23 00.000:00:00.000倫敦

然後小時重置00,得到2013年4月12日00:倫敦

00.000

然後回到斯德哥爾摩時間產量

2013年4月12日01:00 00:00.000

當你做了測試(一個t 2013-04-13 00:00:00.00在斯德哥爾摩)倫敦仍在前一天(2013-04-12)。

編輯

時午夜發生在各城市(斯德哥爾摩時間表示),你可能想知道是什麼。 我會去這樣的事情:

public static void main(String[] args) throws ParseException { 
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    formatter.setTimeZone(TimeZone.getTimeZone("Europe/Stockholm")); 

    String date = "2013-04-13"; 
    System.out.println("Stockholm: " + formatter.format(getMidnightTime("Europe/Stockholm", date))); 
    System.out.println("London: " + formatter.format(getMidnightTime("Europe/London", date))); 
    System.out.println("Helsinki: " + formatter.format(getMidnightTime("Europe/Helsinki", date))); 
} 

public static Date getMidnightTime(String timeZoneId, String date) throws ParseException { 
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
    formatter.setTimeZone(TimeZone.getTimeZone(timeZoneId)); 
    return formatter.parse(date); 
} 


Stockholm: 2013-04-13 00:00:00.000 
London: 2013-04-13 01:00:00.000 
Helsinki: 2013-04-12 23:00:00.000 
+0

HOUR_OF_DAY固定小時,但不是一天。輸出仍然是:「倫敦:2013年4月12日01:00:00:00」 – Oliveira