最近在做一个迁移老项目的工作,把一个PHP项目上的功能模块迁移到一个Java项目中,前台数据通过solr查询展现,然后就发现查询到的日期类型数据都比当时存进去的日期多8个小时(正好一个时区),各种查找资料后才发现里面的小九九。
原因是Solr的日期类型是标准的XML Schema的"日期型数据格式",T后面跟着"时间",Z代表0时区 ,又叫UTC统一时间,也就是英国的格林尼治天文台的时间,而我们中国在东八区,用的是GMT时间,比UTC时间多了8个小时。如图:
如果存储的时候是String类型的话,用SimpleTimeFormat处理一下就可以得到正确的时间
@Test public void testdata()throws ParseException{ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); String date = "2018-06-22T19:26:23Z"; try { System.out.println("转换结果:"+sdf.parse(date)); } catch (ParseException e) { e.printStackTrace(); } }
但是我这项目里存的就是Data型数据,所以不能采取以上方式处理,js中处理方式如下:
/** * solr日期转换 * @param creationTime * @returns {number} */ function timeToSolr(creationTime){ return creationTime-28800000; }
注:28800000ms=8h
Java中处理方式如下:
/** * solr日期转换 * @param solrDate * @return */ public String formDate(Date solrDate) { String newDate = ""; try { if (solrDate == null) { return null; } Calendar ca = Calendar.getInstance(); ca.setTime(solrDate); ca.add(Calendar.HOUR_OF_DAY, -8); newDate = DateFormatUtils.format(ca.getTime(),"yyyy-MM-dd HH:mm:ss"); } catch (Exception e) { e.printStackTrace(); } return newDate; }
引荐一篇大神分析的文章吧:https://www.jianshu.com/p/8f65ffbd5c74