【问题标题】:How can I format day and month in the locale-correct order in Java?如何在 Java 中按照语言环境正确的顺序格式化日期和月份?
【发布时间】:2019-06-28 06:49:36
【问题描述】:

有没有办法在 Java/Kotlin 中按照语言环境正确的顺序来格式化日期和月份(以紧凑的形式)而不是年份?所以对于英语应该是“Sep 20”,但对于瑞典语应该是“20 sep.”。

作为比较,在 Cocoa 平台上,我可以执行以下操作(在 Swift 中):

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "sv_SE")
formatter.setLocalizedDateFormatFromTemplate("MMM d")
print(formatter.string(from: Date()))

这将正确地扭转局面。 Java SDK 是否有类似的事情?我一直在尝试使用DateTimeFormatter 和较旧的SimpleTimeFormat API 的各种形式,但没有成功。

注意:this question 不同,我不想要包含年份的完整中等格式。我也不想要DateTimeFormatter.ofPattern("MMM d"),因为这会在瑞典语中给出不正确的结果,或者DateTimeFormatter.ofPattern("d MMM"),因为这会在英语中给出不正确的结果。

【问题讨论】:

  • @Mark No,即包括年份,即完整的日期格式
  • 仅供参考,Java 确实提供了 MonthDay 类来表示没有年份的月份和日期。不幸的是,java.time 的自动本地化功能目前还没有扩展到这个特定的类,我们称之为DateTimeFormatter.ofLocalized…

标签: java localization date-formatting


【解决方案1】:

不,对不起。我知道没有任何 Java 库会自动将 "MMM d" 转换为 20 sep.,以适应在月份缩写之前首选月份日期的语言环境。

您可以尝试用这种方式修改answer by Rowi

DateTimeFormatter ft = 
    DateTimeFormatter
    .ofLocalizedDate(FormatStyle.MEDIUM)
    .withLocale(Locale.forLanguageTag("sv-SE"))
;

但是结果是:

9 月 20 日。 2019

它包括您没有要求的年份。

高级解决方案将使用DateTimeFormatterBuilder 类来构建DateTimeFormatter 对象。

DateTimeFormatterBuilder
.getLocalizedDateTimePattern(
    FormatStyle.MEDIUM, 
    null, 
    IsoChronology.INSTANCE, 
    Locale.forLanguageTag("sv-SE")
)

这将返回 d MMM y。修改此字符串以删除y 及其前面的空格。请注意,在其他语言中,y 可能是 yyyyyyu,并且可能不在字符串的最后。将修改后的格式模式字符串传递给DateTimeFormatter.ofPattern

它可能是不稳定的。即使您查看了所有可用语言环境的格式模式字符串,CLDR(字符串的来源)的下一个版本仍可能包含一个惊喜。但我认为这是我们能做的最好的。如果是我,我会考虑抛出异常,以防我检测到来自 getLocalizedDateTimePattern 的字符串看起来不像我知道如何修改的字符串。

【讨论】:

  • 谢谢!不幸的是,这似乎是正确的答案。获取格式字符串并对其进行修改确实感觉有点不稳定......
  • 谢谢!很棒的建议,所有的。
【解决方案2】:

您可以使用 LocalDate 在 Java 中执行此操作:

LocalDate dt = LocalDate.parse("2019-09-20"); 
System.out.println(dt);   
DateTimeFormatter ft = DateTimeFormatter.ofPattern("dd MMM", new Locale("sv","SE")); 
System.out.println(ft.format(dt));

【讨论】:

  • 谢谢,但这并不能真正解决问题。应该是“9 月 20 日”。瑞典语,但英语是“Sep 20”,我不必指定每种语言的顺序。
  • @skagedal, With Locale (new Locale("sv","SE")) 它将格式化为“20 sep”而没有 Locale ,它将格式化为“20 Sep”
  • @Rowi 那仍然没有回答问题。这是关于日和月的顺序。对于英国语言环境,它应该是“月日”,对于瑞典语,它应该是“日月”
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2015-05-31
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多