您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關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上輸出系統語言和系統區域,結果都是中文:
說明系統語言設置是沒問題的,于是接著使用debug模式一步一步找到異常的地方,終于發現了問題出現在這里:
根據msf4j的源代碼所呈現時間轉換邏輯:
在類 DateTypeAdapter
中,聲明了3個用于轉換的DateFormat 實例,分別是:
enUsFormat 美國語言
localFormat 本地語言
iso8601Format iso8601標準
接下來調用轉換方法private synchronized Date deserializeToDate(String json)
將string
轉換為Date
對象,完成轉換
不過很不幸的是,在linux 和 mac中,全都轉換失敗,只有在windows下才會轉換成功,通過在debug模式下查找,發現原因在創建DateFormat
實例的時候DateFormat.getDateTimeInstance()
,mac模式下獲取到的locale是en_CN
:
windows模式下獲取到的locale是zh_CN
:
所以問題就在en_CN
和zh_CN
這里,其中,en
和zh
表示的是系統語言,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());//輸出系統國家名稱
輸出結果為:
不過即使輸出為中文和中國,但是也還有可能出錯,因為在實例 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系統中的語言是中文
加上英文
,像這樣:
Locale.Category.Format
獲取到的language就會是en
,所以就變成了en_CN
(英文_中國),然后轉換就是失敗了
所以解決辦法就是在創建DateFormat
實例之前,給jvm
設置Locale.setDefault(Locale.CHINA)
,這樣就避免了jvm
在查找系統語言的過程中找到除了中文語言之外的其他語言,造成轉換失敗的異常
當然,如果把英文
刪除,只保留中文
,則不用設置Locale
為CHINA
也沒問題了,所以linux 上也是如此,在系統語言中,設置了不止一個中文語言,還包括英語,雖然第一語言是中文。
以上就是msf4j微服務框架中ParseException: Unparsable date: "2019-01-01 00:00:00"異常怎么處理,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。