【问题标题】:toInstant() in Calendar is showing in GMT instead of Local time日历中的 toInstant() 显示为 GMT 而不是当地时间
【发布时间】:2015-10-30 11:59:18
【问题描述】:
我正在尝试将日历实例转换为即时,我正在这样做
Calendar cal = new GregorianCalendar();
System.out.println(cal.getTime());
Instant inst = cal.toInstant();
System.out.println(inst.toString());
而且,它的输出如下
2015 年 10 月 30 日星期五 17:23:40 IST
2015-10-30T11:53:40.037Z
所以,我的问题是关于日历和即时输出的差异。瞬间的输出是格林威治标准时间而不是本地时间。
我没有看到任何文档说 Instant 类只给出 GMT 的日期。所以,我不确定为什么会这样。
【问题讨论】:
标签:
java
date
datetime
calendar
【解决方案1】:
在 Instant 上调用 toString 会产生如下输出:
2013-05-30T23:38:23.085Z
此格式遵循 ISO-8601 标准来表示日期和
时间。
看看:
【解决方案2】:
Rawat 的answer 是正确的。根据定义,Instant 始终采用 UTC。
toString 方法生成的字符串表示的格式是标准的,由 ISO 8601 定义。
Instant 类是 Java 8 及更高版本中内置的 java.time 框架的一部分。这个框架中的新类取代了 Java 早期的旧 java.util.Date/.Calendar 类。
避免使用旧课程,因为它们出了名的麻烦。不要混淆新旧。 toInstant 等转换方法仅适用于尚未针对新类型更新旧代码互操作时使用。
要将Instant 调整为时区,请通过ZoneId 对象指定时区以生成ZonedDateTime。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
不要被LocalDateTime 类中的“本地”所迷惑。该类代表了日期时间的模糊概念。它不适用于任何特定时区,因此与时间线无关。