java - 格式化 XmlGregorianCalendar 时区问题

标签 java date timezone format

我需要将 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 日。我做错了什么?我应该什么时候设置时区?

最佳答案

它被解析为 4 月 15 日午夜 UTC。然后将其格式设置为 4 月 14 日 EDT 晚上 8 点,这是正确的,因为 EDT 比 UTC 晚四个小时。

请注意,Date.toString() 始终使用本地 时区 - Date 对象不知道它所在的时区.

您的格式化值使用默认时区,因为您没有指定时区。日历值 (gc) 是 UTC,但是当您对其进行格式化时,它将应用来自格式化程序的时区(当您格式化 Date 值时,它不会时区)。

目前尚不清楚您要实现的目标,但希望这会有所帮助。顺便说一句,我强烈建议您使用 Joda Time相反,如果可能的话 - 它使很多事情变得更加清晰。

关于java - 格式化 XmlGregorianCalendar 时区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9241229/

相关文章:

java - 如何通过标签名称检索多个标签内的元素以进行selenium自动化测试

java - Android java - 将字符串 "2013/12/17"正确转换为UNIX的时间戳

jenkins - <jenkins> 管道触发器中的时区

java - 如何在 netbeans 中单步执行/调试导入的 java 代码

java - 使用具有关系的 Spring Data REST 发布实体

Java SimpleDateFormat 解析不可逆?

c# - 字符串在 shamsi date fa-ir 中未被识别为有效的日期时间

javascript - 如何使用 javascript 中的时区名称和区域在 UTC 中查找时区偏移量

asp.net - 从 SQL 2005 Server 访问 TimeZoneInfo

java - 如何限制 Play 向导中的验证?