我的 solr 中有一条数据: 使用 Solr 管理用户界面,修改时间为“2016-04-20T13:58:35.805Z”。
使用 solrj: 在此处输入图像描述,修改时间为“Wed Apr 20 21:58:35 CST 2016”。
我正在使用solr6。为什么?
来自 Solr Administration User Interface 的 modifyTime 数据格式为 UTC,可以通过 datetime 字符串末尾的 Z 来理解,表示该字符串表示的日期是 UTC。
2016-04-20T13:58:35.805Z
另一方面,来自数据格式的 modifyTime 是 CST –中国中部 标准时间,在您的情况下,它似乎是 + 8 小时。
Wed Apr 20 21:58:35 CST 2016
发生这种情况是因为 java.util.Date 没有时区但它的 toString 方法应用 JVM 的当前默认时区的 Java 烦人且糟糕的功能。
java.util.Date date = ( java.util.Date ) doc.getFieldValue("modifyTime");
DateTime dateTimeUtc = new DateTime( date, DateTimeZone.UTC );
String output = dateTimeUtc.toString();
编辑
感谢@BasilBourque 对CST(时区缩写)含义的建议
阿尔弗雷多的答案是正确的,但有一个假设。该答案提到中央标准时间,但该区域落后于UTC(7 或 6 小时),而问题中的数据领先于 UTC。所以我假设CST
这里指的是中国标准时间,比世界标准时间早 8 点。
这种混淆说明了为什么我们不应该使用这些 3-4 个字母的缩写,例如CST
. 它们不是真正的时区,不是标准化的,甚至不是唯一的(正如我们在这里看到的)。而是使用适当的 tz/IANA 时区,格式为continent/region
.
问题是使用旧的日期时间类。在 Java 8 和后来的 java.time 框架中,这些设计不佳且臭名昭著的类已被取代。
Instant instant = Instant.parse( "2016-04-20T13:58:35.805Z" );
调用toString
以获取根据ISO 8601标准格式化的相同类型的字符串。
应用时区以通过特定地区的挂钟时间的镜头看到同一时刻。应用 aZoneId
来获取一个ZonedDateTime
对象。
例如,America/Montreal
挂钟时间比 UTC 晚四小时,所以小时09
而不是13
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );
2016-04-20T09:58:35.805-04:00[美国/蒙特利尔]
Instant
和都ZonedDateTime
代表时间线上的同一个同时点。