0

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

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

调用时有什么方法可以阻止从 GMT+0 到 GMT+2 的移动cal.getTime()

Ps 我们在我的公司使用 Java 7。

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

4

2 回答 2

2

不是Date那个有时区的。日期只是“纪元”(格林威治标准时间 1970 年 1 月 1 日)以来的毫秒数。它们不包含时区信息。当您格式化显示日期时,您只会看到时区。默认情况下,它使用您所在地区的时区。您可以使用不同的或SimpleDateFormat打印日期。LocaleTimeZone

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

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

于 2018-01-18T14:06:10.057 回答
0

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

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

但是,如果您删除“Z”指示符,您将按照您的时区设置时间。

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

于 2018-01-18T14:20:06.740 回答