2013-03-17 48 views
0

我的格式爲年月日,我試圖解析爲使用作爲爲什麼從String轉換日期時Java時區不同?

public static DateFormat getDateFormat() { 
    SimpleDateFormat result = new SimpleDateFormat("yyyyMMdd");     
    result.setLenient(false); 
    return result; 
} 

獲得的日期格式我設置的默認時區時,在程序運行的

public static void doTheDateZoneInit() { 
    TimeZone tzone = TimeZone.getTimeZone("Europe/London"); 
    TimeZone.setDefault(tzone); 
} 

當日期日期字符串我格式化日期並輸出它,而不在打印字符串中指定時區

Date myDate= getDateFormat().parse("20110331"); 
System.out.println("Date after it is formatted:" + myDate); 

輸出在BST時區

Date after it is formatted:Thu Mar 31 01:00:00 BST 2011 

如果我有不同的日期運行相同的一遍又一遍,我得到不同的輸出

  • 20120331 >> BST >>日期被格式化後:星期六3月31日1點00分〇〇秒BST 2012
  • 20121231 >> GMT >>日期被格式化後:週一12月31日00:00:00 GMT 2012
  • 20130328 >> GMT >>日期被格式化後:週四3月28日00:00:00 GMT 2013
  • 20130331 >> GMT >>格式化後的日期:Sun M ar 31 00:00:00 GMT 2013
  • 20140331 >> BST >>格式化後的日期:星期一3月31日01:00:00 BST 2014
  • 20130401 >> BST >>格式化後的日期:星期一Apr 01 01:00:00 BST 2013
  • 20130402 >> BST >>格式化後的日期:Tue Apr 02 01:00:00 BST 2013
  • 20130501 >> BST >>格式化後的日期:Wed May 01 01:00:00 BST 2013

似乎有一個範圍從2012年到2013年,所有計算到格林威治標準時間。我不知道爲什麼會發生這種情況。

問題是,我在這些日期中添加了結束時間...... 我使用從String轉換的日期調用以下方法,並將23:59:59:999添加到它以便獲取指定日期的最新時間。

public static Date addAlmostOneDay(Date startDate) { 
    Calendar cal = new GregorianCalendar(); 
    cal.setTime(startDate); 
    cal.add(Calendar.HOUR, 23); 
    cal.add(Calendar.MINUTE, 59); 
    cal.add(Calendar.SECOND, 59); 
    cal.add(Calendar.MILLISECOND, 999); 
    return cal.getTime(); 
} 

但在其轉換爲GMT如果我要添加23時59分59秒......這不是設置的日期原始日期的結束,而是採用BST之間的時間差異列表的情況下和GMT考慮

  • 太陽03月31日00:00:00 GMT 2013成爲週一4月1日零點59分59秒BST 2013(次日+ 1小時) 而
  • 週一4月1日01:00: 00 BST 2013變成Mon Apr 01 23:59:59 BST 2013(今天結束是我想要的)

有人可以請說明爲什麼這似乎是hapening。相同的代碼是用不同的YYYMMDD格式輸入運行的?

+1

我不明白。您將默認時區設置爲BST,然後打印日期,並且在BST時區輸出日期會感到驚訝嗎?這不是預期的嗎?或者我錯過了什麼?你可以發佈SSCCE,告訴我們你期望它做什麼以及它做什麼? – 2013-03-17 10:26:47

回答

5

好吧我想我明白你的意思了。您將默認時區設置爲倫敦之一。

夏天,倫敦在英國夏令時(BST)時區。在冬天,它在格林威治標準時區。而這個時區變化的日子每年都不一樣。

+0

謝謝JB ......這很有道理。我來自南非,時間總是一樣的。更有意義。 :) – Chrispie 2013-03-17 11:35:50

+1

@Chrispie是的,夏令時是真正的羣體瘋狂。一個巨大的混亂和昂貴的努力沒有任何證明的好處。通常,在信息處理中最好用UTC來處理和存儲數據時間值(無時區偏移量)。然後轉換爲時間分區值,僅用於呈現給用戶。 – 2014-04-08 14:01:07

2

BST是英國夏時和倫敦2013年3月31日之間的有效時區 - 2013年10月27日和2014年3月30日 - 10月26日2014年

這些日期間歐洲/倫敦選擇的時間在冬季,倫敦的正確時區是GMT,這與您的輸出一致。

相關問題