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(解析字符串时),但有什么建议可以解决这个问题吗?
-
Java 7回答了您的两个问题:获取ThreeTen Backport并使用现代Java日期和时间API。 它可以让您对时区和偏移量进行严密控制,并且可以直接支持微秒。 另外,一般来说,使用起来要好得多。
-
你好Ole。 从您发送的链接确实看起来我创建了关于我的问题的时区部分的副本。:(
-
@ChristopherBarrett你的问题也是其他主题的重复,包括解析微秒。 在发布之前彻底搜索Stack Overflow; 您可以假设已经询问和回答了大多数基本日期时间问题。
它不是具有时区的Date。自"时代"(格林威治标准时间1970年1月1日)以来,日期只是几毫秒。它们不包含时区信息。格式化显示日期时,只能看到时区。默认情况下,它使用您的语言环境的时区。您可以使用SimpleDateFormat打印具有不同Locale或TimeZone的日期。
确保Calendar实例具有正确的TimeZone(例如,您可能必须明确设置它:cal.setTimeZone(TimeZone.getTimeZone("GMT"));)。
如果我是你,我会切换到Joda时间库或ThreeTen Backport并使用设计得更好的java.time。内置的java.util.Date/Calendar类是一个可以使用的噩梦。它们的设计很差且可变,这意味着你不能相信它们作为传递的价值对象。
-
答案是对的。 我同意,切换到更现代的日期和时间API。 现在你就是这样,为什么不选择java.time,这是由Joda-Time背后的人们开发的现代Java日期和时间API? Joda-Time处于维护模式,已完成项目,因此java.time似乎是面向未来的选择。
-
谢谢Ole。 我不知道有一个后退。 我把它添加到我的答案中。
-
鉴于解析是正确的,字符串中的Z应确保Calendar具有UTC(AKA Zulu)时区,AKA零偏移。 我仍然完全同意,避免使用该类并通过backport继续java.time。
虽然我同意@ELEVATE,但我必须补充说,iso 8601日期格式使用时区。
我们可以看到您正在使用"Z"指示器有效地设置时区,但未指定它。因此,日历是使用您当地的时区构建的,但时间定义为UTC(如果您愿意,则为GMT,因此在您的情况下为GMT + 2h00)。
但是,如果您删除了"Z"指示符,则您将按照时区设置时间。
例如,请参阅https://en.wikipedia.org/wiki/ISO_8601#Time_zone_designators
-
这取决于所需的时区。 我的猜测是Z正是因为OP想要从UTC偏移0。 OP最能说清楚。 否则你是完全正确的。