Gson centos日期转换失败
https://4aiur.github.io/2018/03/26/gson-dateformat-pattern/
问题描述:
线上的日志里报了一个JsonSyntaxException的异常:
1 |
Exception in thread "main" com.google.gson.JsonSyntaxException: 2018-03-26 22:22:35 |
生产场景:
RPC框架是hessian, 这个错误发生在调用hessian接口时, 本地一切正常, 放到线上就报错.
解决办法:
最后发现调用时反序列化时Gson是这样实例化的
1 |
Gson gson = new Gson() |
改为工厂模式构建出的Gson就好了
1 |
Gson builderTime = (new GsonBuilder()).setDateFormat("yyyy-MM-dd HH:mm:ss").create();
|
复现问题:
实体类里只有java.util.Date类型, 按理说序列化之后应该是Mon Mar 26 21:17:43 CST 2018才对, 这个时间格式明显是被格式化了,
于是发现在hessian的服务端, GsonBuilder格式化了这个时间,
1 |
Gson gson = (new GsonBuilder()).setDateFormat("yyyy-MM-dd HH:mm:ss").create();
|
把实体类格式化成了这种样子
{"name":"foo","startTime":"2018-03-26 21:17:43"}
而在另一边, 在hessian的客户端, 是这样反序列的:
1 |
Gson gson = new Gson(); |
在win10简体中文版环境下一切正常, 结果到了线上CentOS环境下,
这样Gson gson = new Gson()得到的gson不能正常的将yyyy-MM-dd HH:mm:ss格式的时间转换为GMT格式.
分析源码:
根据报错信息打开出错的源头com.google.gson.internal.bind.DateTypeAdapter.java类中的deserializeToDate()方法, 这个方法是这样的
1 |
private synchronized Date deserializeToDate(String json) {
|
这是一个很暴力的适配器模式, localFormat, enUsFormat, ISO8601Utils挨个尝试转换,那么这三个值具体是什么呢, 打个断点来看看:
ISO8601:
首先是ISO8601,Google的大佬直接hard code 成Locale.US.
这是个UTC时间, T标识是UTC时间,Z标识时区, 北京时间比UTC快的8个小时, 会被记作UTC+8, 这就是东八区的由来, 如下:
UTC例子
EnUsFormat:
再看enUsFormat,
美国的时间会标记出上午和下午, 时间格式是MMM dd, yyyy hh:mm:ss a, 例如Sep 16, 2015 10:34:23 AM.
LocalFormat:
最后是localFormat,
注意到这个java.text.DateFormat#getDateTimeInstance(int, int)这个方法,
不同地区规定的常用日期格式是不一样的, 查询WIKI百科各地日期和时间表示法,得知这个日期格式是台湾的常用日期格式,
问题它怎么知道我是在美国还是在中国台湾, 看getDateTimeInstance方法的源码
getDateTimeInstance()
发现这个方法在Java7之后, 根据操作系统的语言, 判断用户所在的时区,
那现在将WIN10控制面板=>时钟、语言和区域=>添加语言=>更改windows显示语言为英语-美国, 再来看localFormat变成了什么:
us-localFormat
坑爹啊Gson, 使用locale命令查一查线上CentOS7的语言环境
1 |
[root@VM_0_9_centos ~]# locale |
果然是英文环境, 这样的话yyyy-MM-dd HH:mm:ss,
既无法被UTC时间yyyy-MM-dd'T'HH:mm:ss'Z'适配,
无法被美国默认时间MMM dd, yyyy hh:mm:ss a适配, 最后抛出了JsonSyntaxException.
根治:
改成中文, 并重启系统
1 |
// 查看系统拥有语言包 |
zh_CN.UTF-8是简体中文,如果没有zh_CN.UTF-8,就安装语言包,如果存在可以直接设置
1 |
// 安装简中语言包 |
永久修改系统语言
1 |
localectl set-locale LANG=zh_CN.UTF8 |
Gson centos日期转换失败的更多相关文章
- SAP字段带空格,导致日期转换失败,提示not a vaild month
执行此节点会报以下错误,ORA-01843,no a valid month,提示月份转换异常 尝试增加条件也仍然提示错误:and VBEP.EDATU<>'00000000' and V ...
- 使用gson将字符串转换成对象
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); System.out.pr ...
- gson日期转换问题
转:http://blog.csdn.net/liao_leo/article/details/44593095 今天遇到个很奇怪的问题,gson解析日期字符串,本地执行可以,服务器上执行就报错. 这 ...
- allow zero datetime=true导致datetime转换失败:MySql.Data.Types.MySqlDateTime”的对象无法转换为类型“System.Nullable`1[System.DateTime]
allow zero datetime=true导致datetime转换失败:MySql.Data.Types.MySqlDateTime”的对象无法转换为类型“System.Nullable`1[S ...
- 大型运输行业实战_day09_1_日期转换与My97DatePicker插件使用
1.日期转换 1.1字符串类型转换成时间Date类型 /** * 给定字符串 转变 为 Date 类型 * @param date 时间 * @param format 时间格式 如:yyyy-MM- ...
- 解决fastjson反序列化日期0000-00-00失败的方案
解决fastjson反序列化日期0000-00-00失败的方案 22 Jul 2016 一.案例场景复原 示例场景里涉及两个class:TestDemo.java, DateBeanDemo.java ...
- springMvc的日期转换之二
方式一:使用@InitBinder注解实现日期转换 前台页面: 后台打印: 方式二:处理多种日期格式类型之间的转换 采用方式:由于binder.registerCustomEditor(Date.cl ...
- Struts2中Date日期转换的问题
今天跑程序的时候莫名其妙的出现了下面的一个异常: java.lang.NoSuchMethodException:com.ca.agent.model.mybatis.ApprovalInforC ...
- Js 日期转换函数(UTC时间转换及日期想加减)
IOS上Js日期转换中new Date("yyyy-mm-dd")不能正常工作,必须使用new Date("yyyy/MM/dd"); 日期相加减: Date. ...
随机推荐
- 第一次博客作业 <西北师范大学| 周安伟>
1.助教博客链接:https://home.cnblogs.com/u/zaw-315/ 2.本周点评的作业数:3份,有留言互动. 3.本周点评有困难的地方: https://www.cnblogs ...
- WebSocket 实现链接 发送消息
Websocket 原理浅析地址: https://www.cnblogs.com/yuanyongqiang/articles/10457793.html 直接上代码: myWebSocket.py ...
- centos7 端口3306无法连接问题
MySQL建用户的时候会指定一个host,默认是127.0.0.1/localhost,那么这个用户就只能本机访问,其它机器用这个用户帐号访问会提示没有权限,host改为%,表示允许所有机器访问. G ...
- java8 LocalDateTime转unix时间戳(带毫秒,不带毫秒)
转载自:LocalDateTime To Timestamp Epoch Seconds And Milliseconds Convert LocalDateTime to seconds since ...
- gulp打包普通项目
第一步:npm init 生成一个page.json第二步建立一个gulpfile.js文件主要是写这个文件 var gulp = require('gulp'), rev = require('gu ...
- 安装pygame出现is not a supported wheel on this platform解决办法
安装python库pygame时出现如下错误: 查看python的版本是否与之匹配,发现版本不匹配问题 例如1.我的python3.6是32位的,就只能安装cp36的:结果发现安装还是出现问题: 2. ...
- 20175325 《JAVA程序设计》实验二《JAVA开发环境的熟悉》实验报告
20175325 <JAVA程序设计>实验二<JAVA开发环境的熟悉>实验报告 一.实验报告封面 课程:Java程序设计 班级:1753班 姓名:石淦铭 学号:20175325 ...
- [二分答案][NOIP2015]跳石头
跳石头 题目描述 一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起 ...
- 关于学习python的想法
选择学习python,就是一次对自己的挑战.自己之前并没有python的基础,只是学习了一点C语言的知识.对于这个课程了解的不是很多,只是上学期在网上自学了一点,自己也是对这门语言感兴趣,所以这个学期 ...
- Mybatis中的CDATA标签
术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data). 在 XML 元素中,"<" 和 "&& ...