现象
现在我需要通过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存储和展示都和源数据相同了。
这样我们既不该源码也不改配置就解决了时差问题。
本文写得比较啰嗦,主要是为了复现整个问题以便于有同样问题的朋友对号入座。
感谢阅读!!!