我需要将java XmlGregorianCalendar格式化为“yyMMdd”字符串。 我的实施:
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
4月15日解析为4月14日。我做错了什么?什么时候我应该设置时区?
答案 0 :(得分:4)
它被解析为4月15日午夜 UTC 。然后格式化为4月14日晚上8点 EDT ,这是正确的,因为EDT比UTC落后4小时。
请注意,Date.toString()
始终使用本地时区 - Date
对象不知道它所在的时区。
您使用默认时区的格式化值也,因为您尚未指定时区。日历值(gc
)是UTC格式,但是当您对其进行格式化时,它将应用格式化程序中的时区(格式化Date
值时, < / em>时区)。
目前尚不清楚你想要达到的目标,但希望这会有所帮助。顺便说一句,我强烈建议您使用Joda Time代替,如果可能的话 - 它会使这一点变得更加清晰。