我的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。为什么呢?
答案 0 :(得分:2)
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)
answer by Alfredo是正确的但是有一个假设。该答案提到了中央标准时间,但该区域落后于 UTC(7或6小时),而问题中的数据是提前的UTC。所以我假设CST
这里指的是China Standard Time,它比UTC早8个。
这种混淆表明为什么我们不应该使用这些3-4字母缩写,例如CST
。它们不是真正的时区,不是标准化的,甚至不是唯一的(正如我们在这里看到的)。而是以continent/region
。
问题是使用旧的日期时间类。这些设计糟糕且声名狼借的类已经在Java 8及更高版本的java.time框架中被取代。
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 [美国/蒙特利尔]
Instant
和ZonedDateTime
都代表时间轴上的同一点。