接受的答案是正确的。 java.util.Date类没有分配时区,但它的toString
实现混淆地应用了JVM的当前默认时区。
避免java.util.Date & .Calendar
这是很多原因,以避免出了名的麻烦java.util.Date,.Calendar,和SimpleDateFormat类与Java捆绑之一。避免它们。相反,请使用:
约达时间
在约达时间2.3如下一些示例代码。搜索StackOveflow了解更多示例和大量讨论。
DateTimeZone timeZoneLondon = DateTimeZone.forID("Europe/London");
DateTimeZone timeZoneAthens = DateTimeZone.forID("Europe/Athens");
DateTime nowLondon = DateTime.now(timeZoneLondon);
DateTime nowAthens = nowLondon.withZone(timeZoneAthens);
DateTime nowUtc = nowLondon.withZone(DateTimeZone.UTC);
java.time
的Java 8和更高版本有一个新的java.time package内置。这个软件包受到了Joda-Time的启发。虽然他们有一些相似之处和类名,但它们是不同的;每个都有其他缺点。一个显着的区别是java.time避免了构造函数,而是使用静态实例化方法。
在这个问题的情况下,他们的工作方式是一样的。指定一个时区,然后调用now
方法获取当前时刻,然后基于旧的不可变实例创建一个新实例以调整时区。
请注意两个不同的时区类。一个是命名时区,其中包括夏令时和其他此类异常的所有规则以及来自UTC的偏移量,而另一个仅为偏移量。
ZoneId zoneMontréal = ZoneId.of("America/Montreal");
ZonedDateTime nowMontréal = ZonedDateTime.now (zoneMontréal);
ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo");
ZonedDateTime nowTokyo = nowMontréal.withZoneSameInstant(zoneTokyo);
ZonedDateTime nowUtc = nowMontréal.withZoneSameInstant(ZoneOffset.UTC);
†其实java.util.Date
类确实有埋内its source code一个时区。但是班级为了最实际的目的忽略了那个时区。所以,作为简写,通常会说j.u.Date没有分配时区。混乱?是。避免使用j.u.Date,并使用Joda-Time和/或java.time。
你想使用[乔达时间](http://stackoverflow.com/a/375803/1037210)?这是我的偏好。 – Lion
检查[这个答案](http://stackoverflow.com/questions/230126/how-to-handle-calendar-timezones-using-java)。它可以派上用场。 – Gamb
我在网上发现了另一件事,它可能是最干净的解决方案,它使用日期时间格式来解析日期字符串并在相应时区返回日期 – Bober02