有没有办法在 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")
,因为这会给出错误的英语结果。
最佳答案
不,抱歉。据我所知,没有哪个 Java 库会自动将 "MMM d"
转换为 20 sep.
,以适应更喜欢月份缩写之前的月份日期的语言环境。
您可以尝试修改answer by Rowi这样:
DateTimeFormatter ft =
DateTimeFormatter
.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(Locale.forLanguageTag("sv-SE"))
;
但是结果是:
20 sep. 2019
其中包括您没有询问的年份。
高级解决方案将使用 DateTimeFormatterBuilder
构建类DateTimeFormatter
对象。
DateTimeFormatterBuilder
.getLocalizedDateTimePattern(
FormatStyle.MEDIUM,
null,
IsoChronology.INSTANCE,
Locale.forLanguageTag("sv-SE")
)
这将返回d MMM y
。修改此字符串以删除 y
及其前面的空格。请注意,在其他语言中,y
可能是 yy
、yyyy
或 u
,并且可能不会出现在字符串的最后。将修改后的格式模式字符串传递给 DateTimeFormatter.ofPattern
。
可能会不稳定。即使您查看所有可用语言环境的格式模式字符串,CLDR 的下一版本(字符串的来源)可能仍然包含惊喜。但我认为这是我们能做的最好的事情。如果是我,我会考虑抛出异常,以防我检测到 getLocalizedDateTimePattern
中的字符串看起来不像我知道如何修改的字符串。
关于java - 如何在 Java 中按照区域设置正确的顺序格式化日期和月份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60608601/