如何在 Java 中以语言环境正确的顺序格式化日和月?

ska*_*dal 6 java localization date-formatting

有没有办法在 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()))
Run Code Online (Sandbox Code Playgroud)

这将正确地扭转局面。Java SDK 是否有相同的功能?我一直在尝试各种形式DateTimeFormatterSimpleTimeFormatAPI和旧API,但没有成功。

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

Ole*_*.V. 6

不,对不起。我知道没有 Java 库会自动"MMM d"转换20 sep.为更喜欢月份缩写之前的月份的语言环境。

您可以尝试以这种方式修改Rowi答案

DateTimeFormatter ft = 
    DateTimeFormatter
    .ofLocalizedDate(FormatStyle.MEDIUM)
    .withLocale(Locale.forLanguageTag("sv-SE"))
;
Run Code Online (Sandbox Code Playgroud)

然而结果是:

9 月 20 日 2019年

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

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

DateTimeFormatterBuilder
.getLocalizedDateTimePattern(
    FormatStyle.MEDIUM, 
    null, 
    IsoChronology.INSTANCE, 
    Locale.forLanguageTag("sv-SE")
)
Run Code Online (Sandbox Code Playgroud)

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

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