2011-10-05 63 views
5

我有一個時區和用戶的區域設置。現在我想要獲取日期模式。如何從Java語言環境的時區獲取日期模式

例如:用戶的時區PST和語言環境美,我希望該模式是「MM/DD/YYYY」,如果用戶的時區爲IST和Locale印度,那麼模式我想到的是「DD/MM/YYYY」

如何得到它?

注:我想得到的模式不是實際的日期,以便我可以在其他地方使用它。

+1

爲什麼不在「這個其他地方」使用語言環境,而不僅僅是模式? –

+0

嗨Petal Ivanov,實際上,我想將模式傳遞給Javascript,所以我不能使用Locale。 –

回答

1

真的你需要TZ的日期模式嗎?通常的方法是在本地化屬性文件中爲語言環境(或locale_country)創建數據模式。我認爲這就夠了。

+0

我不需要TZ作爲日期模式。但一般來說,這就是我手中的內容(用戶的時區詳細信息)。 「通常的方法是在本地化(或locale_country)的本地化屬性文件中使用數據模式」 - 這是否意味着最好的方法是在國家級維護日期模式(並將其保存在數據庫或文件系統中)? –

+0

是的。 TZ無法從http請求中檢索,因此您只知道客戶端的區域/國家/地區。另一種方法是詢問用戶TZ並將其與用戶信息的其餘部分一起保存在數據庫中。 – yoprogramo

3

將日期/時間格式翻譯爲Locale的邏輯嵌套在java.text.SimpleDateFormat#SimpleDateFormat構造函數中,正好在sun.util.resources.LocaleData#getDateFormatData中。該方法提供ResourceBundle,然後根據選擇哪種樣式查詢特定模式。

換句話說 - 不幸的是JDK似乎沒有提供API/SPI來訪問原始格式。我的建議是一直使用Locale並將其傳遞給格式化/解析方法。

+0

+1將傳遞的語言環境轉換爲您自己的格式化方法,最終靈活的解決方案 – Dapeng

0

聽起來好像你想要DateFormat上的static getInstance methods。它們對於樣式(短,長等)採用整數常量,並且可以選擇不同的區域設置(而不是JVM的默認設置)。

0

可以使用Interface Map

的k將是區域設置 在V將與日期模式的字符串

0

如果您在使用約達時間(爲什麼你會不會,如果您有任何選擇它差點捆綁到JDK 1.7),你可以做這樣的事情:

String patternForStyleAndLocale = org.joda.time.format.DateTimeFormat.patternForStyle("S-", locale); 

不幸的是只給一個兩位數的年份。一個解決的,這將是:

if (!org.apache.commons.lang.StringUtils.contains(patternForStyleAndLocale, "yyyy")) 
{ 
    // The default Joda pattern only has a two digit year for US and Europe, China etc - but we want four digit years 
    patternForStyleAndLocale = StringUtils.replace(patternForStyleAndLocale, "yy", "yyyy"); 
} 

而且你可以考慮在ConcurrentHashMap<Locale, String>緩存他們。

買一臺數字日期爲這樣的預本地化的模式的好處是,它並不以後需要任何進一步的定位,因爲它會如果你使用諸如圖案做:

"dd MMM yyyy" // UK: "25 Dec 2010" FRANCE: "25 déc. 2010" etc.. 

不過...我只是從你後面的評論注意到,你想通過模式的JavaScript - 這可能會很困難,因爲JS使用不同的模式格式化爲Java(ISO日期例如是Java "yyyy-MM-dd""yy-mm-dd"在JS)。我沒有試過解決這個問題,但我可能會在JS或Java中使用一些字符串映射來簡單地將Java模式映射到JS。當然,您必須先了解每種語言可能遇到的每種模式。

相關問題