2011-10-05 62 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。当然,您必须先了解每种语言可能遇到的每种模式。

相关问题