1. 问题发生

   前几天在一台客户给的linux服务器上部署一个后端jar服务时,忽然抛出了这个Caused by: java.text.ParseException: Unparseable date异常。排查代码后来发现,是我们调用用户中心接口时,拿到数据后,用gson进行了对象转换,并从日志里看到是日期转换时抛的错误。

2. 问题分析

   因为在我们本地开发的时候,没有发生这个问题,所以当时也没有想到对Gson对象设置日期格式。但是部署到linux服务器报出这个错误,因为是微服务项目,还是挺多服务的,一个个的加太麻烦,而且,我优先想到的,也是服务器系统问题,而不是代码问题,代码能有什么问题???。
  基于这样的疑惑,然后跟运维大佬一番打听,因为是客户新给的服务器,我还是挺怀疑他们服务器里的默认设置,比如linux服务器的时期格式、时区、编码等是否正常。
  最后果然发现了点不一样的。

3. 问题解决

   在linux服务器输入locale命令时,发现如下图所示情况:
在这里插入图片描述
   这说明当前服务器是英文格式编码,反正其他地方都正常,就这里不对,先改了它再说,感觉也就是它的问题了。然后在linux服务器上做了如下操作:
   输入cd ~ 或者就只输入cd,回到家目录下(有的不是root目录) ,依次执行以下命令。

echo 'export LANG=zh_CN.UTF-8' >> .bash_profile

echo 'export LC_ALL="zh_CN.UTF-8"' >> .bash_profile

   以上命令依次执行,然后再输入locale发现已经变成了下边这样
在这里插入图片描述
   因为我不懂运维,运维建议是要写入到linux的配置文件里,这样防止有的服务器在重连后,又变回去的问题。
   最后重启服务,再试,发现gson转换正常。

4. 事后思考

   虽然最正确的方式,可能大部分人觉得是在书写时应该定义好时间格式,比如这样:

Gson gson= new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();

   但是这样写,我记得是,貌似gson就只认识这种格式的时间了。当然接口一般也不会变格式,这样写没错。
   最后我才想到,因为英文编码下不是我们国家这样定义时间,什么yyyy-MM-dd,人家都这样写:
在这里插入图片描述
   因为我们接口里是中文编码下的写法,所以,为什么需要改成zh_CN.UTF-8编码了。
   说了这么一大堆,其实就只需要服务器上执行下那两行命令即可。

Logo

更多推荐