Java 根據國家語言的時間格式化
阿新 • • 發佈:2019-01-25
總所周知,java的時間格式化使用SimpleDateFormat類中的#format和#parse方法,但是這個根據JVM的語言、國家來確定的對格式的解析,例如yyyy MMM dd 對於不同的國家語言是不一樣的。
Date date = new Date();
DateFormat sdf = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
System.out.println(sdf.format(date));
輸出結果為:2016 十一月 24 14:35:19
API中對 M的解釋為:
如果模式字母的數量為 3 或大於 3,則將月份解釋為 text;否則解釋為 number。
由於系統的語言環境是中文,所以這裡月份的輸出的十一月 。
但是我想輸出的月份是Nov怎麼辦呢?
上文中提到SimpleDateFormat是根據JVM的國家和語言來進行模式解析的,顯然 Nov不符合中國的。當然可以通過改變windows系統的國家語言設定,也可以通過程式碼來實現 ,只需要新增一句話:
Locale.setDefault(Locale.US);
也可以使用SimpleDateFormat的構造方法SimpleDateFormat(String pattern, Locale locale)
修改後的程式碼:
Date date = new Date();
Locale.setDefault (Locale.US);
DateFormat sdf = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
DateFormat sdf_locale = new SimpleDateFormat("yyyy MMM dd HH:mm:ss",Locale.US);
System.out.println(sdf.format(date));
System.out.println(sdf_locale.format(date));
程式碼的輸出為:2016 Nov 24 14:41:19
使用parse時同理,在new SimpleDateFormat之前設定JVM 的預設語言環境就可以。
可以想到的應用場景:在開發網路爬蟲時,遇到國外的網站 大多以 月份的簡寫或單詞 不是以數字的形式,需要把時間換成成距離1970年1月1日的毫秒數(Date#getTime方法),或者轉換成自己的時間表達格式。