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

文章讲述了在将代码从Mac本地部署到服务器后,遇到Gson解析日期格式错误的问题。解决方案是通过设置GsonBuilder的日期格式为yyyy-MM-dd,或者注册自定义的Date类型适配器来避免时间格式不匹配导致的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景是这样的,优化迭代之前的代码,在mac本地自测完全没有问题,自测流畅完成,然后就部署到服务器上去了,结果,还真就出问题了!!!

在这里插入图片描述

问题

先看报错日志

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需要设置时间格式才能正常使用,默认的不是标准格式。


最后

  • 好看的灵魂千篇一律,有趣的鲲志一百六七!
  • 如果觉得文章还不错的话,可以点赞+收藏+关注 支持一下,鲲志的主页 还有很多有趣的文章,欢迎小伙伴们前去点评
  • 如果有什么需要改进的地方还请大佬指出❌

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲲志说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值