温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

msf4j微服务框架中ParseException: Unparsable date: "2019-01-01 00:00:00"异常怎么处理

发布时间:2021-10-20 17:33:37 来源:亿速云 阅读:177 作者:柒染 栏目:大数据

本篇文章给大家分享的是有关msf4j微服务框架中ParseException: Unparsable date: "2019-01-01 00:00:00"异常怎么处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

最近遇到一个问题,前端接口在往后端接口传值的时候,时间字符串(比如:2019-01-01 00:00:00)转 timestamp 出错了,导致接口调用失败,同样的代码,在windows上运行是OK的,但是到linux或者mac上就会出现异常,初步怀疑是Windows和linux/Mac的时区不一致导致的,于是在mac和Linux上输出系统语言和系统区域,结果都是中文:

msf4j微服务框架中ParseException: Unparsable date: "2019-01-01 00:00:00"异常怎么处理

说明系统语言设置是没问题的,于是接着使用debug模式一步一步找到异常的地方,终于发现了问题出现在这里:

msf4j微服务框架中ParseException: Unparsable date: "2019-01-01 00:00:00"异常怎么处理

msf4j微服务框架中ParseException: Unparsable date: "2019-01-01 00:00:00"异常怎么处理

根据msf4j的源代码所呈现时间转换逻辑:

  1. 在类 DateTypeAdapter中,声明了3个用于转换的DateFormat 实例,分别是:

  • enUsFormat 美国语言

  • localFormat 本地语言

  • iso8601Format iso8601标准

  1. 接下来调用转换方法private synchronized Date deserializeToDate(String json)string转换为Date对象,完成转换

不过很不幸的是,在linux 和 mac中,全都转换失败,只有在windows下才会转换成功,通过在debug模式下查找,发现原因在创建DateFormat实例的时候DateFormat.getDateTimeInstance(),mac模式下获取到的locale是en_CN

msf4j微服务框架中ParseException: Unparsable date: "2019-01-01 00:00:00"异常怎么处理

windows模式下获取到的locale是zh_CN:

msf4j微服务框架中ParseException: Unparsable date: "2019-01-01 00:00:00"异常怎么处理

所以问题就在en_CNzh_CN这里,其中,enzh表示的是系统语言,en表示英语(一般指美国英语),zh表示中文,CN表示国家-中国,换个方式看可能更好理解:

        Locale locale = Locale.getDefault();
        System.out.println(locale.getLanguage());//输出系统语言代码
        System.out.println(locale.getCountry());//输出系统国家代码
        System.out.println(locale.getDisplayLanguage());//输出系统语言名称
        System.out.println(locale.getDisplayCountry());//输出系统国家名称

输出结果为:

msf4j微服务框架中ParseException: Unparsable date: "2019-01-01 00:00:00"异常怎么处理

不过即使输出为中文和中国,但是也还有可能出错,因为在实例 DateFormat localFormat = DateFormat.getDateTimeInstance(2, 2) 创建的过程中,并不需要指定locale,该方法会去使用一个系统默认语言Local.Category.Format:

public final static DateFormat getDateTimeInstance(int dateStyle,
                                                       int timeStyle)
    {
        return get(timeStyle, dateStyle, 3, Locale.getDefault(Locale.Category.FORMAT));
    }

这时候如果mac系统中的语言是中文加上英文,像这样:

msf4j微服务框架中ParseException: Unparsable date: "2019-01-01 00:00:00"异常怎么处理

Locale.Category.Format获取到的language就会是en,所以就变成了en_CN(英文_中国),然后转换就是失败了

所以解决办法就是在创建DateFormat实例之前,给jvm设置Locale.setDefault(Locale.CHINA),这样就避免了jvm在查找系统语言的过程中找到除了中文语言之外的其他语言,造成转换失败的异常

当然,如果把英文删除,只保留中文,则不用设置LocaleCHINA也没问题了,所以linux 上也是如此,在系统语言中,设置了不止一个中文语言,还包括英语,虽然第一语言是中文。

以上就是msf4j微服务框架中ParseException: Unparsable date: "2019-01-01 00:00:00"异常怎么处理,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI