原来是Gson导致,本地和linux服务器不同的环境导致Date转换出现问题:Invalid time zone indicator ‘ ‘

简介: 看到报错日志,第一反应就是,date数据的问题,同时又能发现全是和gson相关结合报错行数的代码,盲猜就是gson对时间处理的问题了于是寻找解决方法

问题



先看报错日志


Caused by: java.text.ParseException: Failed to parse date ["2021-11-01 00:00:00"]: Invalid time zone indicator ' '
  at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:274) ~[gson-2.8.9.jar!/:?]
  at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:85) ~[gson-2.8.9.jar!/:?]
  ... 15 more
Caused by: java.lang.IndexOutOfBoundsException: Invalid time zone indicator ' '
  at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:245) ~[gson-2.8.9.jar!/:?]
  at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:85) ~[gson-2.8.9.jar!/:?]


看到报错日志,第一反应就是,date数据的问题,同时又能发现全是和gson相关

结合报错行数的代码,盲猜就是gson对时间处理的问题了

于是寻找解决方法


解决



因为我代码中确实使用了gson.fromJson()方法,网上也查到是时间转换的问题

报错的使用方式


Gson gson = new Gson();
gson.fromJson();



解决方法


因为我只需要yyyy-MM-dd时间格式,那么就显示声明gson的时间格式即可


Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
gson.fromJson();


Gson的issue也有这个解决方案:Invalid time zone indicator ’ ’


其他问题的解决方法


如果你的报错类似如下


com.google.gson.JsonSyntaxException: 1525688551000
java.text.ParseException: Failed to parse date ["1525688551000']: Invalid time zone indicator '5'


那么可能是因为:Gson无法解析位数太长的时间格式

可以尝试用GsonBuilder 注册Date类型解决:


GsonBuilder builder = new GsonBuilder();
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();


原因



GoogleGson在处理Date格式时有小陷阱,默认处理Date对象的序列化/反序列化是通过一个SimpleDateFormat对象来实现的,通过下面的代码去获取实例:


DateFormat.getDateTimeInstance()


在不同的环境中,这样获取到的SimpleDateFormat的模式字符串会不一样。


例如,我的本地默认模式字符串是:“yyyy-M-d H:mm:ss”


服务器的模式字符串则是:“MMM d, yyyy h:mm:ss a”


这就使得同样的Date对象通过Gson来序列化为JSON后内容不同


所以Gson需要设置时间格式才能正常使用,默认的不是标准格式。


目录
相关文章
|
3天前
|
弹性计算 JavaScript 应用服务中间件
在一台ECS服务器上优雅部署多环境:实践攻略
在ECS上部署多环境应用,通过Nginx反向代理实现。规划端口或子域名区分开发、测试和生产环境。配置应用监听不同端口,如Node.js应用修改启动脚本。【6月更文挑战第21天】
121 3
|
1天前
|
监控 Linux BI
【linux服务器系统盘爆满】/www/server/total/logs/目录内容过多导致服务器系统盘爆满,/www/server/total/logs/ 里是什么内容?是否可以删除?
【linux服务器系统盘爆满】/www/server/total/logs/目录内容过多导致服务器系统盘爆满,/www/server/total/logs/ 里是什么内容?是否可以删除?
5 1
|
1天前
|
NoSQL Linux 开发工具
【Linux】Linux环境基础开发工具_6
【Linux】Linux环境基础开发工具_6
5 0
|
1天前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_5
【Linux】Linux环境基础开发工具_5
4 0
|
1天前
|
小程序 Linux 开发工具
【Linux】Linux环境基础开发工具_4
【Linux】Linux环境基础开发工具_4
6 0
|
1天前
|
Linux 开发工具 C语言
【Linux】Linux环境基础开发工具_3
【Linux】Linux环境基础开发工具_3
3 0
|
1天前
|
Linux Shell 开发工具
【Linux】Linux环境基础开发工具_2
【Linux】Linux环境基础开发工具_2
3 0
|
1天前
|
Linux 开发工具 C语言
【Linux】Linux的权限_2 + Linux环境基础开发工具_1
【Linux】Linux的权限_2 + Linux环境基础开发工具_1
5 0
|
1天前
|
安全 Linux Python
【安全狗】linux免费服务器防护软件安全狗详细安装教程
【安全狗】linux免费服务器防护软件安全狗详细安装教程
3 0
|
5天前
|
数据可视化 网络协议 Linux
Linux 怎样通过win 远程桌面连接链接Linux后台服务器的可视化图形界面
Linux 怎样通过win 远程桌面连接链接Linux后台服务器的可视化图形界面
11 0