我正在尝试将Calendar实例转换为即时实例,我这样做如下
Calendar cal = new GregorianCalendar();
System.out.println(cal.getTime());
Instant inst = cal.toInstant();
System.out.println(inst.toString());
并且,其输出如下
IST 2015年10月30日17:23:40
2015-10-30T11:53:40.037Z
因此,我的问题是有关日历和即时输出的差异。即时的输出以格林尼治标准时间而不是当地时间为准。
我还没有看到任何文档说Instant类仅在GMT中给出日期。因此,我不确定为什么会这样。
最佳答案
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
类中的“本地”混淆。该类表示日期时间的模糊概念。它不适用于任何特定时区,因此不受时间轴的限制。