使用solrj获取8小时的日期差异

时间:2016-07-25 09:06:19

标签: java solr solrj solr6

我的solr中有数据: Using the Solr Administration User Interface,modifyTime为" 2016-04-20T13:58:35.805Z"。

使用solrj: enter image description here,修改时间为"周四2016年4月20日21:58:35 CST 2016"。

我使用solr6。为什么呢?

2 个答案:

答案 0 :(得分:2)

来自Solr管理用户界面的

modifyTime数据格式是UTC,您可以通过日期时间字符串末尾的Z来理解它,表明该日期的字符串表示形式为UTC。

2016-04-20T13:58:35.805Z 

另一方面,来自数据格式的modifyTime是CST - Central 中国标准时间,在您的情况下,它似乎是+ 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(时区缩写)含义的建议

答案 1 :(得分:0)

中国标准时间(CST)

answer by Alfredo是正确的但是有一个假设。该答案提到了中央标准时间,但该区域落后于 UTC(7或6小时),而问题中的数据是提前的UTC。所以我假设CST这里指的是China Standard Time,它比UTC早8个。

这种混淆表明为什么我们不应该使用这些3-4字母缩写,例如CST。它们不是真正的时区,不是标准化的,甚至不是唯一的(正如我们在这里看到的)。而是以continent/region

的形式使用proper tz/IANA time zones

java.time

问题是使用旧的日期时间类。这些设计糟糕且声名狼借的类已经在Java 8及更高版本的java.time框架中被取代。

该字符串应由Instant直接解析,以获取UTC中的值。

Instant instant = Instant.parse( "2016-04-20T13:58:35.805Z" );

调用toString以获取相同类型的字符串,格式符合ISO 8601标准。

应用时区,通过特定地区wall-clock time的镜头观看同一时刻。应用ZoneId获取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 [美国/蒙特利尔]

InstantZonedDateTime都代表时间轴上的同一点。