【快递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();
    }
posted @ 2021-12-04 09:46  layman~  阅读(123)  评论(0编辑  收藏  举报