关于java:Calendars getTime方法修改时区

Calendars getTime method modifies the timezone

本问题已经有最佳答案,请猛点这里访问。

我有一个问题,即Calendar.getTime()方法更改时区(可能与JVM一致)。

1
2
Calendar cal  = javax.xml.bind.DatatypeConverter.parseDateTime("2017-10-20T07:10:08.123458Z");
Date datrFromCal = cal.getTime();//Adds two hours(GMT+2:00)

调用cal.getTime()时,有没有办法阻止GMT + 0到GMT + 2的移动?

附: 我们在公司使用Java 7。

与此相关的另一件事是支持微秒。 我已经阅读了很多关于Java 7及以下版本的不支持microSeconds(解析字符串时),但有什么建议可以解决这个问题吗?


它不是具有时区的Date。自"时代"(格林威治标准时间1970年1月1日)以来,日期只是几毫秒。它们不包含时区信息。格式化显示日期时,只能看到时区。默认情况下,它使用您的语言环境的时区。您可以使用SimpleDateFormat打印具有不同LocaleTimeZone的日期。

确保Calendar实例具有正确的TimeZone(例如,您可能必须明确设置它:cal.setTimeZone(TimeZone.getTimeZone("GMT"));)。

如果我是你,我会切换到Joda时间库或ThreeTen Backport并使用设计得更好的java.time。内置的java.util.Date/Calendar类是一个可以使用的噩梦。它们的设计很差且可变,这意味着你不能相信它们作为传递的价值对象。


虽然我同意@ELEVATE,但我必须补充说,iso 8601日期格式使用时区。

我们可以看到您正在使用"Z"指示器有效地设置时区,但未指定它。因此,日历是使用您当地的时区构建的,但时间定义为UTC(如果您愿意,则为GMT,因此在您的情况下为GMT + 2h00)。

但是,如果您删除了"Z"指示符,则您将按照时区设置时间。

例如,请参阅https://en.wikipedia.org/wiki/ISO_8601#Time_zone_designators