使用solrj获取相差8小时的日期
Use solrj to get the date difference of 8 hours
我的solr中有一个数据: Using the Solr Administration User Interface,modifyTime是“2016-04-20T13:58:35.805Z”。
使用 solrj:
enter image description here,修改时间为"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 – Central China Standard Time,在你的情况下似乎是 + 8 小时。
Wed Apr 20 21:58:35 CST 2016
发生这种情况是因为 Java 烦人且糟糕的功能,其中 java.util.Date 没有时区,但它的 toString 方法应用了 JVM 当前的默认时区。
java.util.Date date = ( java.util.Date ) doc.getFieldValue("modifyTime");
DateTime dateTimeUtc = new DateTime( date, DateTimeZone.UTC );
String output = dateTimeUtc.toString();
编辑
感谢@BasilBourque 对 CST(时区缩写)含义的建议
中国标准时间 (CST)
比UTC快8的 is correct but for one assumption. That answer mentions Central Standard Time, but that zone is behind UTC (7 or 6 hours) while the data in the Question is ahead of UTC. So I presume CST
here refers to China Standard Time
这种混淆说明了为什么我们不应该使用这些 3-4 个字母的缩写,例如 CST
。它们不是真正的时区,不是标准化的,甚至不是唯一的(正如我们在这里看到的)。而是以 continent/region
.
的形式使用 proper tz/IANA time zones
java.time
问题是使用了旧的日期时间类。这些设计糟糕且出了名的麻烦 类 已在 Java 8 及更高版本中被 java.time 框架取代。
那个字符串应该直接被Instant
to get a value in UTC解析。
Instant instant = Instant.parse( "2016-04-20T13:58:35.805Z" );
调用toString
to get the same kind of string back, formatted according to the ISO 8601标准。
应用时区,通过特定地点的 wall-clock time. Apply a ZoneId
to get a 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[America/Montreal]
Instant
和 ZonedDateTime
都表示时间轴上的同一时间点。
我的solr中有一个数据: Using the Solr Administration User Interface,modifyTime是“2016-04-20T13:58:35.805Z”。
使用 solrj: enter image description here,修改时间为"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 – Central China Standard Time,在你的情况下似乎是 + 8 小时。
Wed Apr 20 21:58:35 CST 2016
发生这种情况是因为 Java 烦人且糟糕的功能,其中 java.util.Date 没有时区,但它的 toString 方法应用了 JVM 当前的默认时区。
java.util.Date date = ( java.util.Date ) doc.getFieldValue("modifyTime");
DateTime dateTimeUtc = new DateTime( date, DateTimeZone.UTC );
String output = dateTimeUtc.toString();
编辑
感谢@BasilBourque 对 CST(时区缩写)含义的建议
中国标准时间 (CST)
比UTC快8的CST
here refers to China Standard Time
这种混淆说明了为什么我们不应该使用这些 3-4 个字母的缩写,例如 CST
。它们不是真正的时区,不是标准化的,甚至不是唯一的(正如我们在这里看到的)。而是以 continent/region
.
java.time
问题是使用了旧的日期时间类。这些设计糟糕且出了名的麻烦 类 已在 Java 8 及更高版本中被 java.time 框架取代。
那个字符串应该直接被Instant
to get a value in UTC解析。
Instant instant = Instant.parse( "2016-04-20T13:58:35.805Z" );
调用toString
to get the same kind of string back, formatted according to the ISO 8601标准。
应用时区,通过特定地点的 wall-clock time. Apply a ZoneId
to get a 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[America/Montreal]
Instant
和 ZonedDateTime
都表示时间轴上的同一时间点。