日历getTime方法修改时区

时间:2018-01-18 13:53:30

标签: java date timezone timezone-offset java.util.calendar

我遇到一个问题,即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)

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

P.S。我们在公司使用Java 7。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

但是,如果您删除了' Z'指标,你按照你的时区设置时间。

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