带语言环境的日期格式

时间:2018-01-23 09:45:45

标签: java android date locale datetime-format

我想根据每个国家/地区的日期格式显示日期。我终于尝试了很多方法,我找到了这个例子

http://www.java2s.com/Code/Java/Data-Type/DateFormatwithLocale.htm

这给出了我的意思的完美输出。某些国家/地区德国不会使用 12hr 格式,而是使用 24小时格式与无AM / PM 。虽然像 US 这样的国家使用12小时格式。

但是我发现在运行这个java类时它会按预期返回正确的输出但是在Android项目中运行它会返回类似这样的内容

I/System.out: Locale: en_US
I/System.out: Jan 23, 2018 5:26:41 AM
I/System.out: Jan 23, 2018 5:26:41 AM
I/System.out: Jan 23, 2018 5:26:41 AM
I/System.out: Jan 23, 2018 5:26:41 AM
I/System.out: Jan 23, 2018 5:26:41 AM
I/System.out: Locale: de_DE
I/System.out: 23.01.2018 5:26:41 vorm.
I/System.out: 23.01.2018 5:26:41 vorm.
I/System.out: 23.01.2018 5:26:41 vorm.
I/System.out: 23.01.2018 5:26:41 vorm.
I/System.out: 23.01.2018 5:26:41 vorm.

对于Locale:en_US它是预期的但是在Locale的情况下:de_DE预计不会有“vorm”。

有人可以解释这种行为吗?

3 个答案:

答案 0 :(得分:0)

这是java JDK中的本机行为。

取决于您传递的有效区域设置,JDK提供格式化日期的时间。

返回一个新的DateFormat实例,该实例使用指定语言环境的给定格式样式格式化日期。

Parameters:
style the given formatting style. Either one of DateFormat.SHORT, 
DateFormat.MEDIUM, DateFormat.LONG, or DateFormat.FULL.
locale the desired locale.
Returns: a date formatter.
Throws: java.lang.IllegalArgumentException if style is invalid, or if locale isn't 
one of the locales returned from getAvailableLocales().
java.lang.NullPointerException if locale is null
See also: java.text.DateFormat.getDateInstance(int,java.util.Locale)

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/text/spi/DateFormatProvider.java#DateFormatProvider.getTimeInstance%28int%2Cjava.util.Locale%29

答案 1 :(得分:0)

    LocalDateTime dateTime = LocalDateTime.of(2018, 1, 23, 5, 26, 41);
    DateTimeFormatter formatter = DateTimeFormatter
            .ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.GERMAN);
    System.out.println(dateTime.format(formatter));

打印

23.01.2018, 05:26:41

虽然没有在Android上测试过,但我相信结果会一样。

java.time

您链接到的java2s页面上使用的DateDateFormat类已经过时,特别是后者也非常麻烦。仅仅因为这个原因,我建议你停止使用它们,然后开始使用现代Java日期和时间API java.time。使用起来好多了。

你能在Android上做到吗?你当然可以。我被告知java.time内置于较新的Android设备上。对于旧设备,请将ThreeTenABP添加到项目中(请参阅底部的链接),并确保导入org.threeten.bp.LocalDateTimeorg.threeten.bp.format.DateTimeFormatterorg.threeten.bp.format.FormatStyle。然后一切都会奏效。

出了什么问题?

Java从不同的来源获取其语言环境信息。它在桌面Java和Android Java之间有所不同,甚至可能因Android设备而异,并且它在Java版本之间有所不同。在没有任何保证的情况下,我认为java.time在这方面比旧班级更稳定。

链接

答案 2 :(得分:0)

最后我找到了答案.. :)感谢Ole V.V.

这是:Java DateFormat.SHORT in Android not working as expected