解决java与solr时差8小时问题实录

解决java与solr时差8小时问题实录

现象

现在我需要通过java向solr存数据,其中原始数据的字段类型是String,值是“14-Aug-2008”。
在这里插入图片描述
需求是字段存储到solr必须为时间类型。
首先在solr配置文件managed-schema.xml配置自定义域:
在这里插入图片描述
类型是pdate
然后java中定义field
SolrInputDocument doc = new SolrInputDocument();
doc.setField(“csv_launch_date”, date); //date为Date类型
所以需要将String的原始值转化为Date类型的值:
在这里插入图片描述
看起来没问题。当我将数据插入到solr然后去页面查询时发现时间不对:
在这里插入图片描述
奇怪!!!!我明明数据值是08年8月14号0点,怎么查出来是08年8月13号16点,后者少了8小时。
然后通过java代码去query solr:
在这里插入图片描述
返回的值又是08年8月14号0点。
可以得出结论,solr存储的确实是08年8月14号0点,然而展示的确实08年8月13号16点。

解决

通过查询得知,solr确实存在时间不对的问题,很多网友也遇到了。网上很多解决办法总结来说就三种:
1)修改solr的配置文件(具体实施自行百度,改了几次我也没成功)
2)向solr存值时手动加上8小时(个人认为绝对不可取,表面上这样做你搜索出来确实对了,但是假如你需要通过solr查询获取返回值,那么你的值又要手动去减8小时,数据一多,一旦你改漏了,那你的数据就错误了。)
3)修改solr源码(具体实施自行百度,这个见仁见智,如果代码就你自己用,可以改;但是如果你的代码需要给别人,就切记将你修改的jar包也贡献出来)
所以上面的办法都没采用,查阅资料得知,问题在于时区。一般我们系统的时区默认是UTC即solr用的UTC,在solr控制台的java properties里也可以看到
在这里插入图片描述
而我国北京时间是领先UTC八小时的,可以在java看到默认是
在这里插入图片描述
所以你的时间传给solr,solr展示数据时通过解析自动减了八小时,从而导致页面查询看着时间少了八小时。
相信耐心看到这里的朋友也知道怎么解决了。那就是在Java格式化时间时设置时区。如下:
在这里插入图片描述
这样,你传值给solr的就是UTC时区时间,solr展示时用UTC解析,这样就对应上了。
再次插入数据,然后solr页面查询:
在这里插入图片描述
java查询solr:
在这里插入图片描述
说明solr存储和展示都和源数据相同了。
这样我们既不该源码也不改配置就解决了时差问题。

本文写得比较啰嗦,主要是为了复现整个问题以便于有同样问题的朋友对号入座。
感谢阅读!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值