【问题标题】:Date Format with Locale带区域设置的日期格式
【发布时间】:2018-07-02 02:05:25
【问题描述】:

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

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

这给出了我的意思的完美输出。 德国等一些国家/地区不会使用 12hr 格式,而是使用 24 hr 格式且没有 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”。

谁能解释这种行为?

【问题讨论】:

  • 上午 5:26 与 24 小时制的 5:26 相同,下午 5:26 与 24 小时制的 17:26 相同
  • 但我不想显示那个“vorm”。如果在下午 5.30 的情况下会显示 17.30 nachm,我只需要它是 17.30
  • "nachm."是德语的 PM,“vorm”。为“上午”。行为符合预期!看看这个链接,localeplanet.com/icu/de-DE/index.html
  • 不是以德语为母语的人我非常同意 AM 的 vorm. 和 PM 的 nach,. 看起来很奇怪而且非常不德语(如何您是否将 Ungerman 大写?)我也希望只有 5:26:41(如果时间是下午,则为 17:26:41)。
  • Oyye.. 感谢@OleV.V 的更新。 , 那是正确的

标签: java android date locale datetime-format


【解决方案1】:

这是 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

【讨论】:

  • 如果是本机行为,那么为什么它会在 java 和 android 中产生 2 个不同的输出?
【解决方案2】:
    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 在这方面比旧类更稳定。

链接

【讨论】:

  • V.V ,嘿,即使在 android 中也能完美运行。但问题是它只能针对 API 26 或更高,这意味着只能在 Android O 或更高版本中。但是我项目的最小 API 是 21。所以我不能用这个。
  • 我认为你可以在 21 级使用 ThreeTenABP。我弄错了吗?不是我的家乡,抱歉……
【解决方案3】:

终于我找到了答案.. :) 谢谢 Ole V.V.

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

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 2014-12-23
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多