2011-03-02 83 views
7

我經常用類似HH:mm:ssyyyy-MM-dd的模式創建SimpleDateFormat以獨立於語言環境的方式輸出日期。由於還有一個構造函數需要一個額外的語言環境參數,我想知道是否有這種格式可以取決於語言環境的情況,或者我應該總是指定Locale.ENGLISH或Locale.GERMANY。讓我們假設時區是明確設置的。語言環境依賴於SimpleDateFormat?

回答

15

就發現語言環境的getAvailableLocales靜態方法,它原來是一個日曆的所有字段可以是依賴於語言環境:

public static void main(String[] args) { 
    String pattern = "yyyy-MM-dd HH:mm:ss"; 
    Date date = new Date(); 
    String defaultFmt = new SimpleDateFormat(pattern).format(date); 

    for (Locale locale : Locale.getAvailableLocales()) { 
     String localeFmt = new SimpleDateFormat(pattern, locale).format(date); 
     if (!localeFmt.equals(defaultFmt)) { 
      System.out.println(locale + " " + localeFmt); 
     } 
    } 
} 

在我的系統(在德國運行Ubuntu的英文版本)這個輸出下面的列表,讓希望的Unicode字符通過完整過來:

ja_JP_JP 23-03-03 16:53:09 
hi_IN २०११-०३-०३ १६:५३:०९ 
th_TH 2554-03-03 16:53:09 
th_TH_TH ๒๕๕๔-๐๓-๐๓ ๑๖:๕๓:๐๙ 

所以JapanThailand使用不同的時代,但AR否則基於gregorian calendar,這解釋了爲什麼月和日是相同的。

其他語言環境還使用不同的腳本編寫數字,例如在印度使用Hindi,在泰國使用泰語的變體。

要回答這個問題,當需要區域獨立字符串時,區域設置應始終指定爲已知值。

編輯: Java 1.6添加了常數Locale.ROOT來指定語言/國家/地區中性語言環境。這將優先於爲計算機指定輸出的英文語言環境。

根區域設置是其語言,國家和變體爲空(「」)字符串的區域設置。這被認爲是所有語言環境的基本語言環境,並被用作區域敏感操作的語言/國家中性語言環境。

4

是的,SimpleDateFormat絕對是區域設置敏感的。某些字段(如小時和分鐘)與語言環境無關。

SimpleDateFormat還支持本地化日期和時間模式字符串。在這些字符串中,上面描述的模式字母可能會替換爲其他與語言環境相關的模式字母。 SimpleDateFormat不處理除模式字母以外的文本的本地化;這取決於班級的客戶。

或者,你可以使用本地化友好DateFormat#getDateInstance()工廠方法來代替,因爲:

public SimpleDateFormat(String pattern, Locale locale)

使用給定語言環境的給定模式和默認的日期格式符號構造SimpleDateFormat 。注意:此構造函數可能不支持所有語言環境。要獲得全面覆蓋,請使用DateFormat類中的工廠方法。

+0

我問不包含任何一個月的圖案或例如'yyyy-MM-dd',我想要一個語言環境獨立輸出,可能通過省略locale參數來保存一些鍵擊。 – 2011-03-02 23:21:05

+0

@Jörn:啊!在這個具體的例子中,你應該沒有問題省略額外的參數。不過,時區格式化可能是一個不同的故事。不過,讓Java擔心特定於語言環境的格式(例如,決定何時使用「mm/dd/yyyy」與「dd/mm/yyyy」)可能會更好。 – 2011-03-02 23:23:03

+1

我已經習慣了總是指定一個語言環境(至少在應用程序不是總是使用系統區域設置的客戶端應用程序時),以確保我(或其他人)不會忘記指定一個模式必須改變。有點像總是在塊周圍使用大括號的規則,即使它只有一行。 – 2011-03-02 23:32:22

0

這對我的作品,也許你應該嘗試一下:

String time = new SimpleDateFormat("HH:mm:ss").format(new Date());

控制檯輸出:

11:52:45