我想根据每个国家/地区的日期格式显示日期。我尝试了很多方法终于找到了这个例子
http://www.java2s.com/Code/Java/Data-Type/DateFormatwithLocale.htm
这给出了我的意思的完美输出。德国等一些国家/地区不会使用12 小时格式,而是使用24 小时格式,并且没有 AM/PM。而一些国家(例如美国)则使用 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.
如果是区域设置:en_US,则符合预期,但如果是区域设置:de_DE,则预计不会有该“vorm”。
谁能解释一下这种行为吗?
最佳答案
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 页面上使用的 Date
和 DateFormat
类早已过时,尤其是后者也非常麻烦。仅出于这个原因,我建议您停止使用它们并开始使用现代 Java 日期和时间 API java.time
。与它一起工作真是太好了。
你能在 Android 上做到这一点吗?你当然可以。我听说 java.time
内置在较新的 Android 设备上。对于较旧的设备,请将 ThreeTenABP 添加到您的项目(请参阅底部的链接),并确保导入 org. Threeten.bp.LocalDateTime 、 org. Threeten.bp.format.DateTimeFormatter 和 org. Threeten.bp.format.FormatStyle 。然后一切都会正常。
出了什么问题?
Java 从不同的来源获取其语言环境信息。它在桌面 Java 和 Android Java 之间有所不同,甚至可能在 Android 设备之间有所不同,并且在 Java 版本之间也有所不同。在没有任何保证的情况下,我认为 java.time
在这方面比旧类更稳定。
链接
- Oracle tutorial: Date Time ,解释如何使用
java.time
。 - Java Specification Request (JSR) 310 ,其中首次描述了 java.time。
- ThreeTen Backport project ,
java.time
到 Java 6 和 7 的向后移植(对于 JSR-310 为 ThreeTen)。 - ThreeTenABP , Android 版 ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project ,有非常详尽的解释。
关于java - 带有区域设置的日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48398572/