近日在用Gson 对时间进行解析时出现以下错误,诡异在再生产环境竟然没有这个问题,测试环境就是不好使~

经过查看源码如下:
DateTypeAdapter 源码

逻辑是依次使用localFormat、enUsFormat、ISO8601Utils进行解析;
先看localFormat和enUsFormat在哪创建的;
这是DateTypeAdapter 的构造方法

localFormat 取的是运行系统的配置:在Linux系统这个位置在/etc/sysconfig/i18n文件下:LANG="zh_CN.GB18030"
enUsFormat 指的美国时区
如果这两个转换均catch 使用ISO8601Utils 进行转换 这个格式只能转换iso 8601 时间格式;
好了,说了这么多废话,怎么解决呢?
方案一:
修改了Linux系统的/etc/sysconfig/i18n 由LANG="en_US.UTF-8" 修改为LANG="zh_CN.GB18030" ,能解决此问题,但是不同的地区的机房会有问题~
方案二:
问题的根本是DateTypeAdapter 的问题
类内自己转换成Date自定义TypeAdaptor就能彻底解决这个问题,截图如下:

代码:
GsonBuilder builder = new GsonBuilder();
// Register an adapter to manage the date types as long values
builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new Date(json.getAsJsonPrimitive().getAsLong());
}
});
Gson gson =builder.create();
网友评论