2009-11-19 119 views
3

我有一個在夏令時期間從今年夏天開始的Java Date。例如:Java日期,使用特定的日光模式進行渲染

2009年6月1日上午06點PDT

我的問題是,我怎麼顯示這個日期作爲我的本地時區和當前夏令模式(在我的情況太平洋標準時間)?

2009年6月1日上午05點PST

Java的Date.toString()SimpleDateFormat顯示在夏令模式的日期。例如:

System.out.println(new Date(1243861200000L)); 

輸出:

週一6月1日6時〇〇分00秒PDT 2009

DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy hh:mm aa zzz"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("PST")); 
System.out.println(dateFormat.format(new Date(1243861200000L))); 

輸出:

2009年6月1日06: 00 AM PDT

我真正想看到的是PST上午5:00(相當於上午6:00 PDT)。有沒有辦法強制它使用另一種夏令時模式?

跟進:順便說一下,這是Windows XP的行爲。在6月1日上午6點創建的文件將在冬季的6月1日上午5點(由資源管理器,命令提示符等)顯示。

+9

這是強制性的,每當有人提到關於Java中的日期以提及喬達時間的問題時。我不知道它是否會做你想要的,但它是強制性的。 – 2009-11-19 01:36:23

+1

我認爲有人沒有直接的頭。誰在問這個?這個不成立。日期/時間在DSMode中是固定的,並且僅隨TZ(地理位移)而變化。 – Don 2009-11-19 01:59:59

回答

2

我不認爲有一種方法可以強制DateFormatTimeZone格式應用於無法存在的時間。 PST僅適用於冬季,PDT僅適用於夏季。

我把這個日期格式化了,所有的TimeZone都返回了TimeZone.getAvailableIDs(),發現有兩個讓我在那個特定時間返回PST:太平洋/皮特凱恩和SystemV/PST8。你可以嘗試使用其中的一種,但我不知道其他規則適用於那些時區對象。

如果您只是關心如何獲得該偏移量的時間,則可以使用GMT-8作爲您的時區。但是,該字符串將顯示在格式化的日期字符串中,而不是PST。

更新:這是採取任何時區並忽略所有夏令時規則的方法。您可以抓住一個TimeZone對象,然後抓住另一個TimeZone.getTimeZone()對象。在第二個對象上,將IdrawOffset設置爲從第一個TimeZone開始的相應對象。

例如:

DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy hh:mm aa zzz"); 
    TimeZone defaultTimeZone = TimeZone.getDefault(); 
    TimeZone timeZone = TimeZone.getTimeZone(""); 
    timeZone.setID(defaultTimeZone.getID()); 
    timeZone.setRawOffset(defaultTimeZone.getRawOffset()); 
    dateFormat.setTimeZone(timeZone); 
    System.out.println(dateFormat.format(new Date(1243861200000L))); 

這將打印出你在尋找什麼。

1

這可能做的伎倆:

/* 
    * Create a date that represents 1,243,861,200,000 milliseconds since 
    * Jan 1, 1970 
    */ 
    Date date = new Date(1243861200000L); 

    /* 
    * Print out the date using the current system's default format and time 
    * zone. In other words, this will print differently if you set the 
    * operating zone's time zone differently. 
    */ 
    System.out.println(date); 

    /* 
    * Specify the format and timezone to use 
    */ 
    DateFormat dateFormat = new SimpleDateFormat(
      "MMM dd, yyyy hh:mm aa zzz"); 
    TimeZone pstTZ = TimeZone.getTimeZone("PST"); 
    dateFormat.setTimeZone(pstTZ); 
    System.out.println(dateFormat.format(date)); 

    /* 
    * It looks like what you want is to actually display a different date 
    * (different # milliseconds since epoch) in the summer months. To do that, you 
    * need to change the date by subtracting an hour. 
    */ 
    if(pstTZ.inDaylightTime(date)){ 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(date); 
     cal.add(Calendar.HOUR, -1); 
     date = cal.getTime(); 
    } 
    //now this should always print "5:00". However, it will show as 5:00 PDT in summer and 5:00 PST in the winter which are actually 2 different dates. So, I think you might need to think about exactly what it is you're trying to achieve. 
    System.out.println(dateFormat.format(date)); 
+2

-1當日期確實在PST時,冬季的日期將會不正確。 – 2009-11-19 03:07:12

+0

謝謝,傑森,我明白這是如何誤導,我會更新我的答案,以便從日期減去一小時後更清楚我想表現的內容。 – Upgradingdave 2009-11-19 11:01:57

2

全年PST/PDT變化。 Java試圖確定哪一個在給定日期有效。這些事情隨着法律和地區的變化而明顯改變。你可以使用絕對時區嗎?在GMT中指定偏移量將在同一年左右。

DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy hh:mm aa zzz"); 
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT-07:00")); 
    System.out.println(dateFormat.format(new Date(1243861200000L))); 

Jun 01, 2009 06:00 AM GMT-07:00 
0
DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy hh:mm aa zzz"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("Pacific/Pitcairn")); 
System.out.println(dateFormat.format(new Date(1243861200000L))); 

附加註釋:ZZZ會打印出PST,而ž會打印出GMT-08:00。 TimeZone.getTimeZone(「EST」)適用於東部標準時間,這讓我覺得這是TimeZone.getTimeZone(「PST」)的一個錯誤。

我建議使用預定義的時間段,因爲它們可能會造成混淆:

public static final TimeZone ZONE_GREENWICH_MEAN_TIME = TimeZone.getTimeZone("GMT"); 
public static final TimeZone ZONE_EASTERN_DAYLIGHT_TIME = TimeZone.getTimeZone("America/New_York"); // EDT, GMT-04:00 
public static final TimeZone ZONE_EASTERN_STANDARD_TIME = TimeZone.getTimeZone("EST"); // GMT-05:00 
public static final TimeZone ZONE_PACIFIC_DAYLIGHT_TIME = TimeZone.getTimeZone("America/Los_Angeles"); // PDT, GTM-0700 
public static final TimeZone ZONE_PACIFIC_STANDARD_TIME = TimeZone.getTimeZone("Pacific/Pitcairn"); // PST, GMT-08:00 

我遇到另一個時間想出了一個類似的問題「2009-11-01 8時44分44秒」。我試着遍歷所有的ID,沒有打印EDT。有趣的是,「2010-11-01 08:44:44」將打印EDT。在1990年到2010年之間,只有2007年,2008年和2010年纔會出版EDT。當我查看從0到2499年的年份時,只有431有EDT,第一次是在1940年(這一定是在EDT推出時)。所以在560年(1940年至2499年),只有431有一個ID打印EDT。從1940年到2006年,只有10年有印刷EDT的ID。 2006年後,每隔4,5或10年,有一年不會列印EDT。