java - 如何在 Java 中按照区域设置正确的顺序格式化日期和月份?

标签 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()))

这将正确地扭转局面。 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 可能是 yyyyyyu,并且可能不会出现在字符串的最后。将修改后的格式模式字符串传递给 DateTimeFormatter.ofPattern

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

关于java - 如何在 Java 中按照区域设置正确的顺序格式化日期和月份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60608601/

相关文章:

java - Java中为什么队列使用LinkedList构造函数

android - 编译字符串值时出错-fr-rFr

c# - Windows 正在从我在一台机器上的日期中删除斜杠

ASP.NET 应用程序正在显示美国日期格式

git - 为什么 git --date=format : ignoring %Z

java - 我的 ArrayList 中的 .add 有什么问题?

java - 无法为 Spring Web 服务的元素找到 BeanDefinitionParser

java - Spring WEB 安全 : list of accessible URLs

ios - 如何获取操作系统语言和语言环境?

java - Spring MVC 中的sample_en.jsp 和sample_fr.jsp