2012-02-11 85 views
3

我需要將java XmlGregorianCalendar格式化爲「yyMMdd」字符串。 我的實現:格式化XmlGregorianCalendar時區問題

XMLGregorianCalendar date = getDate(); //getting the date 

if (date != null) { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); 

     LOG.debug("Parsing date..."); 
     LOG.debug("XML Date: " + date); 
     LOG.debug("XML Date timezone: " + date.getTimezone()); 

     GregorianCalendar gc = date.toGregorianCalendar(); 

     LOG.debug("Gregorian calendar: " + gc.toString()); 
     LOG.debug("Gregorian calendar timezone id: " + gc.getTimeZone().getID()); 

     Date d = gc.getTime(); 

     LOG.debug("Date: " + d.toString()); 

     String formatted = sdf.format(d); 

     LOG.debug("Formatted: " + formatted); 
} 

我看到日誌:

Parsing date... 
XML Date: 1943-04-15T00:00:00.000Z 
XML Date timezone: 0 
Gregorian calendar: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+00:00",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1943,MONTH=3,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=15,DAY_OF_YEAR=1,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0] 
Gregorian calendar timezone id: GMT+00:00 
Date: Wed Apr 14 20:00:00 EDT 1943 
Formatted: 430414 

月,15個被解析爲四月,14我做錯了嗎?當我應該設置時區?

回答

4

它被解析爲4月15日午夜UTC。然後格式化爲4月14日晚上8點EDT,這是正確的,因爲EDT比UTC落後四個小時。

注意Date.toString()總是使用本地時區 - 一個Date對象沒有概念,它的時區是在

格式化後的值使用默認時區,因爲你的天堂」指定時區。日曆值(gc)採用UTC格式,但在格式化時,它將應用格式化程序中的時區(因爲您格式化Date值,而不是具有時區)。

目前還不清楚你試圖達到什麼目的,但希望這會有所幫助。另外,如果可能的話,我強烈建議您使用Joda Time,這會讓這個問題變得更加清晰。

+0

我試圖從XmlCalendar的時區解析它。現在我明白了,我應該爲我的格式化程序設置時區。感謝您的解釋。 – ninja 2012-02-11 15:18:32