如何在Java 8中自动本地化日期格式

时间:2019-01-17 02:34:38

标签: java date datetime java-8 localization

我一直在查看Date and Time library in Java 8,想知道是否有一种方法可以将日期格式化为本地格式,而不管程序在哪里运行(例如,使用区域的本地格式)计算机设置为)。

日期和时间库使用LocalDate类获取日期。默认情况下,使用LocalDate.now()使用yyyy-MM-dd格式。
可以使用DateTimeFormatter对其进行格式化,如下所示:

DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate date = LocalDate.now().format(dtFormatter);

不幸的是,这完全取决于我在ofPattern(pattern)方法中输入的模式。
还有一种ofPattern(pattern, locale)方法允许使用语言环境,但是使用以下代码无法格式化,因为它不会将日期转换为MM-dd-yyyy的美国格式:

DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy", Locale.US);
LocalDate date = LocalDate.now().format(dtFormatter);

如果这行得通,我将尝试使用Locale.getDefault()。不幸的是,它似乎并没有改变任何东西。

因此,可以使用Java 8日期和时间库将日期转换为程序当前运行位置所使用的格式的任何方式。例如,如果我在美国,我将得到MM-dd-yyyy格式;但是如果我的计算机的语言环境设置为英国,则日期将为dd-MM-yyyy。

编辑:我忘了提一下,我已经尝试过为this question提供解决方案,但是此格式将日期设置为dd / MM / yy,但是我更喜欢将其设置为dd -MM-yyyy。我可以使用replaceAll("/","-")将每个/更改为-,但这不会将年份从yy转换为yyyy格式。

1 个答案:

答案 0 :(得分:2)

您的搜索提出了正确的解决方案:

    DateTimeFormatter dateFormatter
            = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
    System.out.println(LocalDate.now().format(dateFormatter));

我将JVM的语言环境设置为Locale.US,立即运行此代码并得到:

  

2019年1月17日

您可以选择所需格式的长度或长度。如果我们使用FormatStyle.SHORT而不是FormatStyle.MEDIUM,那么您的年数只有两位数字是正确的:

  

1/17/19

问题的关键在于它随区域的不同而变化:在其他区域中,您将得到不同的结果,并且可能有些年份会给您带来四位数的年份。因此,您可能会认为这对美国来说是一个极端案例。是否要在代码中设置例外并特别对待美国语言环境,将取决于这对您和您在美国的用户有多重要。

一方面,一些工作已放入本地化格式,所以对于大多数目的,我倾向于更信任它们,而不是相信自己对用户的偏爱。另一方面,有时可能需要特殊考虑,以至于内置的本地化格式并不完全适合特定情况。在后者的情况下,跨地区的情况通常如此。我的直觉表明您可能不会遇到这种情况,因此我的第一个建议是,看看您是否可以使用内置的SHORTMEDIUM格式。

编辑:只需使用FormatStyle.MEDIUM我刚刚注意到您在新西兰。因此,我将JVM的语言环境设置为Locale.forLanguageTag("en-NZ")。现在有了FormatStyle.SHORT,您得到的回报是17/01/19。但是有了FormatStyle.MEDIUM,我得到了17/01/2019,也就是四位数的年份,总的来说,很接近您想要的内容。