一、Solr中的日期格式
Solr是一个高性能的、基于Lucene的企业级全文检索服务器,SolrJ是其提供的用于Java程序访问的API,本文示例即采用的是SolrJ。
在Solr中,日期类型的数据有非常严格的格式限制,为:
YYYY-MM-DDTHH:mm:ssZ //YYYY, MM, DD, HH, mm, ss分别为年、月、日、时(24)、分、秒; //只有ss可以带小数,但只精确到0.001位,即毫秒级; //Z表示时区为UTC,不能更换。
在为文档创建索引时,Solr会根据时区差异,将当地时间转换为上述格式。
比如文档中某时间类型字段为“2019-09-06 10:20:30”,则直接查询到的结果为:
2019-09-06T02:20:00Z //本地时区为UTC+8,所以有相差8小时。
二、消除时区影响的处理
为消除时区影响,可以利用SompleDateFormat类来进行转换,代码如下:
String param = "2019-09-06T02:20:30Z"; SimpleDateFormat sdfSolr = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); sdfSolr.setTimeZone(TimeZone.getTimeZone("UTC")); Date date = sdfSolr.parse(arg); SimpleDateFormat sdfLocal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdfLocal.setTimeZone(TimeZone.getDefault()); System.out.println("Local Time=" + sdfLocal.format(date));
执行结果为:“2019-09-06 10:20:30”。
三、使用toString后的处理
项目中因为多加了一个中间层,对查询到的日期使用了toString()方法,则得到的结果变为CST格式:Fri Sep 06 02:20:30 CST 2019。为此,需对SompleDateFormat做些变化。代码如下:
String param = "Fri Sep 06 02:20:30 CST 2019"; SimpleDateFormat sdfCst = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy", Locale.US); Date date = sdfCst.parse(arg); SimpleDateFormat sdfLocal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdfLocal.setTimeZone(TimeZone.getDefault()); System.out.println("Local Time=" + sdfLocal.format(date));
执行结果仍为:“2019-09-06 10:20:30”。