【快递100接口BUG】数据库时区为0时区,而实际时区为东八区时间,导致存入时间多出八个小时
前些天,上线了快递100的订阅推送服务。
运行稳定,今天早上,运维忽然跟我说,快递单穿越未来了。
我愣了一下,然后运维发了一张图。
说实话,当时我是懵逼的。
因为这个12月03号,下午17:55分还没有到来。
还只是上午而已。
我赶紧区看看程序,发现我的时间格式是这样转化的。
for (SubscribePushData data : dataList) {
SysExpressInfo info = new SysExpressInfo();
info.setCompanyCode(backResp.getLastResult().getCom());
info.setContext(data.getContext());
info.setExpressNum(expressNum);
info.setStatus(data.getStatus());
info.setTime(DateUtils.parseDate(data.getFtime()));
infoList.add(info);
}
if(infoList.size() > 0){
// 入库操作前,先删除sys_express_info表中的数据,只保留最新数据。
expressInfoMapper.deleteSysExpressInfoByNum(expressNum);
expressInfoMapper.insertSysExpressBatch(infoList);
}
DateUtils 是我自定义的时间类工具
/**
* 日期型字符串转化为日期 格式
*/
public static Date parseDate(Object str){
if (str == null){
return null;
}
try{
return parseDate(str.toString(), parsePatterns);
}
catch (ParseException e){
return null;
}
}
parseDate最终调用的是Apache lang3里的方法。
/* @param locale the locale whose date format symbols should be used. If {@code null},
* the system locale is used (as per {@link #parseDate(String, String...)}).
*/
public static Date parseDate(final String str, final Locale locale, final String... parsePatterns) throws ParseException {
return parseDateWithLeniency(str, locale, parsePatterns, true);
}
那段注释是说,如果locale为null,就使用系统时区。
很不幸,当初采购服务器的时候,不知道是谁,一时冲动,把linux系统时间设置为0区。
而且,现在那台服务器跑的程序还很多,没人敢擅自更改它的时区。
没办法,只能自己在程序里处理了。
在网上百度了半天,也不得要领,都是完全没经过验证,就复制粘贴过来的博客。
算逑。
我自己写。
不就是多了八个小时嘛,设置时间的时候减去八小时不就行了。
List<SysExpressInfo> infoList = new ArrayList<>();
for (SubscribePushData data : dataList) {
SysExpressInfo info = new SysExpressInfo();
info.setCompanyCode(backResp.getLastResult().getCom());
info.setContext(data.getContext());
info.setExpressNum(expressNum);
info.setStatus(data.getStatus());
info.setTime(formatTime(data.getFtime()));
infoList.add(info);
}
if(infoList.size() > 0){
// 入库操作前,先删除sys_express_info表中的数据,只保留最新数据。
expressInfoMapper.deleteSysExpressInfoByNum(expressNum);
expressInfoMapper.insertSysExpressBatch(infoList);
}
/**
* 数据库为0时区时间,程序传入时间为东八区,减去8个小时
* @param dateTime :报文中时间字符串
* @return
*/
public Date formatTime(String dateTime){
Date date = DateUtils.parseDate(dateTime);
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.HOUR, -8);
return c.getTime();
}