admin管理员组文章数量:1031952
Gson导致,本地和linux服务器不同的环境导致Date转换出现问题:Invalid time zone indicator ‘ ‘
背景是这样的,优化迭代之前的代码,在mac本地自测完全没有问题,自测流畅完成,然后就部署到服务器上去了,结果,还真就出问题了!!!
问题
先看报错日志
代码语言:javascript代码运行次数:0运行复制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()
方法,网上也查到是时间转换的问题
报错的使用方式
代码语言:javascript代码运行次数:0运行复制Gson gson = new Gson();
gson.fromJson();
解决方法
因为我只需要yyyy-MM-dd时间格式,那么就显示声明gson的时间格式即可
代码语言:javascript代码运行次数:0运行复制Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
gson.fromJson();
Gson的issue也有这个解决方案:Invalid time zone indicator ’ ’
其他问题的解决方法
如果你的报错类似如下
代码语言:javascript代码运行次数:0运行复制com.google.gson.JsonSyntaxException: 1525688551000
java.text.ParseException: Failed to parse date ["1525688551000']: Invalid time zone indicator '5'
那么可能是因为:Gson无法解析位数太长的时间格式
可以尝试用GsonBuilder 注册Date类型解决:
代码语言:javascript代码运行次数:0运行复制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对象来实现的,通过下面的代码去获取实例:
代码语言:javascript代码运行次数:0运行复制DateFormat.getDateTimeInstance()
在不同的环境中,这样获取到的SimpleDateFormat的模式字符串会不一样。
例如,我的本地默认模式字符串是:“yyyy-M-d H:mm:ss” 服务器的模式字符串则是:“MMM d, yyyy h:mm:ss a” 这就使得同样的Date对象通过Gson来序列化为JSON后内容不同
所以Gson需要设置时间格式才能正常使用,默认的不是标准格式。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-12-19,如有侵权请联系 cloudcommunity@tencent 删除time服务器linuxdategsonGson导致,本地和linux服务器不同的环境导致Date转换出现问题:Invalid time zone indicator ‘ ‘
背景是这样的,优化迭代之前的代码,在mac本地自测完全没有问题,自测流畅完成,然后就部署到服务器上去了,结果,还真就出问题了!!!
问题
先看报错日志
代码语言:javascript代码运行次数:0运行复制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()
方法,网上也查到是时间转换的问题
报错的使用方式
代码语言:javascript代码运行次数:0运行复制Gson gson = new Gson();
gson.fromJson();
解决方法
因为我只需要yyyy-MM-dd时间格式,那么就显示声明gson的时间格式即可
代码语言:javascript代码运行次数:0运行复制Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
gson.fromJson();
Gson的issue也有这个解决方案:Invalid time zone indicator ’ ’
其他问题的解决方法
如果你的报错类似如下
代码语言:javascript代码运行次数:0运行复制com.google.gson.JsonSyntaxException: 1525688551000
java.text.ParseException: Failed to parse date ["1525688551000']: Invalid time zone indicator '5'
那么可能是因为:Gson无法解析位数太长的时间格式
可以尝试用GsonBuilder 注册Date类型解决:
代码语言:javascript代码运行次数:0运行复制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对象来实现的,通过下面的代码去获取实例:
代码语言:javascript代码运行次数:0运行复制DateFormat.getDateTimeInstance()
在不同的环境中,这样获取到的SimpleDateFormat的模式字符串会不一样。
例如,我的本地默认模式字符串是:“yyyy-M-d H:mm:ss” 服务器的模式字符串则是:“MMM d, yyyy h:mm:ss a” 这就使得同样的Date对象通过Gson来序列化为JSON后内容不同
所以Gson需要设置时间格式才能正常使用,默认的不是标准格式。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-12-19,如有侵权请联系 cloudcommunity@tencent 删除time服务器linuxdategson本文标签: Gson导致,本地和linux服务器不同的环境导致Date转换出现问题Invalid time zone indicator
版权声明:本文标题:Gson导致,本地和linux服务器不同的环境导致Date转换出现问题:Invalid time zone indicator ‘ ‘ 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747854977a2218105.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论