Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用solrj获得8小时的日期差_Java_Solr_Solrj_Solr6 - Fatal编程技术网

Java 使用solrj获得8小时的日期差

Java 使用solrj获得8小时的日期差,java,solr,solrj,solr6,Java,Solr,Solrj,Solr6,我的解决方案中有一个数据:,修改时间为“2016-04-20T13:58:35.805Z” 使用solrj: ,修改时间为“2016年4月20日星期三21:58:35 CST” 我用的是solr6。为什么?来自Solr管理用户界面的modifyTime数据格式是UTC,您可以通过datetime字符串末尾的Z来理解它,这表明该日期的字符串表示形式是UTC 2016-04-20T13:58:35.805Z 另一方面,来自数据格式的modifyTime是CST–CentralChina标准时间,

我的解决方案中有一个数据:,修改时间为“2016-04-20T13:58:35.805Z”

使用solrj: ,修改时间为“2016年4月20日星期三21:58:35 CST”


我用的是solr6。为什么?

来自Solr管理用户界面的modifyTime数据格式是UTC,您可以通过datetime字符串末尾的Z来理解它,这表明该日期的字符串表示形式是UTC

2016-04-20T13:58:35.805Z 
另一方面,来自数据格式的modifyTime是CST–CentralChina标准时间,在您的情况下,它似乎是+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(时区缩写)含义的建议

来自Solr管理用户界面的modifyTime数据格式为UTC,您可以通过datetime字符串末尾的Z来理解它,表明该日期的字符串表示为UTC

2016-04-20T13:58:35.805Z 
另一方面,来自数据格式的modifyTime是CST–CentralChina标准时间,在您的情况下,它似乎是+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(7或6小时),而问题中的数据领先于UTC。因此,我假定CST在这里指的是比UTC早8的时间

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

java.time 问题在于使用旧的日期时间类。这些设计拙劣且臭名昭著的麻烦类已经在Java8和更高版本中被Java.time框架所取代

应该直接解析该字符串以获取中的值

调用以获取根据标准格式化的相同类型的字符串

应用时区,通过某个特定地点的镜头来观察同一时刻。应用一个函数来获取一个对象

America/Montreal
为例,挂钟时间比UTC晚四小时,因此小时数是
09
而不是
13

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );
2016-04-20T09:58:35.805-04:00[美国/蒙特利尔]

即时时间
分区日期时间
表示时间线上的同一个同时点。

中国标准时间(CST) 这个结论是正确的,但有一个假设。该答案提到了中央标准时间,但该区域落后于UTC(7或6小时),而问题中的数据领先于UTC。因此,我假定CST在这里指的是比UTC早8的时间

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

java.time 问题在于使用旧的日期时间类。这些设计拙劣且臭名昭著的麻烦类已经在Java8和更高版本中被Java.time框架所取代

应该直接解析该字符串以获取中的值

调用以获取根据标准格式化的相同类型的字符串

应用时区,通过某个特定地点的镜头来观察同一时刻。应用一个函数来获取一个对象

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
ZoneDateTime
都代表时间线上的同一个同时点。

这是因为两台机器(承载Solr和本地机器的机器)上的时区不同,本地机器使用CST作为默认时区,你能检查一下Solr机器上的默认时区吗?这是因为你在两台机器上都有不同的时区(托管Solr的机器和本地机器),你的本地机器使用CST作为默认时区,你能检查一下Solr机器上的默认时区吗?我怀疑这个时区是中国标准时间,不是中央。谢谢@BasilBourque,你是对的,我只是想知道为什么CST有这么多小时:)我怀疑这个区域是中国标准时间,不是中央。谢谢@BasilBourque,你是对的,我只是想知道为什么CST有这么多小时:)谢谢!当我使用solrj时,最好的解决方案是什么?我每次都要手动更改结果。我想更改solrj的结果。例如,让它返回DateTime或CST谢谢!当我使用solrj时,最好的解决方案是什么?我每次都必须手动更改结果。我想更改solrj的结果。例如,让它返回DateTime或CST