从当前语言环境检索日期格式模式

时间:2019-09-25 19:33:26

标签: java date

我想检索当前日期格式。没有格式化日期,我需要的是MM/dd/yyyydd/MM/yyyy之类的格式,具体取决于当前的语言环境。我有一个验证程序,可以检查用户是否根据调整后的国家/地区输入了正确的日期。

DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
String format = ((SimpleDateFormat)dateFormat).toPattern();
System.out.println(format); // M/d/yy

正如您在上方看到的,输出与我希望看到的有所不同,我不明白为什么在这种情况下它会返回这种格式而不是MM/dd/yyyy,所以我想知道如何才能检索当前语言环境的模式?

2 个答案:

答案 0 :(得分:2)

tl; dr

LocalDate.parse( 
    input , 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT )
                     .withLocale( Locale.sytemDefault() ) 
)
catch ( DateTimeParseException e ) { … }

避免使用旧的日期时间类

首先,您使用的是可怕的类,这些类在JSR 310中定义的 java.time 类已经过时。

只需解析

  

我有一个验证,可以检查用户是否根据调整后的国家/地区输入了正确的日期。

您不需要事先知道格式。如果要查看用户输入的数据是否适合当前默认值Locale所期望的格式,请尝试解析。如果解析失败,则表明输入不正确。

DateTimeFormatter类可以自动确定适合于特定语言环境的本地化格式。

Locale locale = Locale.sytemDefault() ;   
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( locale ) ;
try 
{ 
    LocalDate localDate = LocalDate.parse( input , f ) ;
} catch ( DateTimeParseException e ) 
{
    … handle the situation of faulty input
}

实际上,.withLocale调用在这里是多余的。如果您未指定语言环境,则将隐式应用JVM当前的默认Locale。我建议您也这样做,使代码明确,以使我们的意图清晰明了。

替代项

有人评论:

  

所以您声称在某些语言环境中,内置格式不正确?

您应该了解本地化是一个复杂的主题。即使在特定的文化中,对于哪种约定合适的看法也可能有所不同。

请注意,在Java版本9中,至少使用OpenJDK的实现,switched the source的本地化详细信息。 OpenJDK现在使用Unicode ConsortiumCommon Locale Data Repository (CLDR)。因此,某些行为和格式可能与早期版本中的有所不同。

最重要的是,惯例会随着时间而改变和发展。

因此,总结:考虑询问用户他们首选的格式是什么。提供一个列表供您选择。将其所需的格式存储为首选项设置。

答案 1 :(得分:2)

我发现您的要求矛盾且不可能。充其量您想尝试滥用内置的本地化格式。

如果您想要美国语言环境的本地化格式,请使用DateTimeFormatterBuilder.getLocalizedDateTimePattern()

    String dateFormatPattern = DateTimeFormatterBuilder
            .getLocalizedDateTimePattern(FormatStyle.SHORT, null,
                    IsoChronology.INSTANCE, Locale.US);
    System.out.println(dateFormatPattern);

输出(在JDK 11上测试):

  

M / d / yy

或者使用FormatStyle.MEDIUM代替FormatStyle.SHORT

  

MMM d,y

另一方面,如果您想要MM/dd/yyyy,只需直接指定即可:

    String dateFormatPattern = "MM/dd/yyyy";

要求前一个代码给出后一个结果没有任何意义。来自CLDR的语言环境数据是适应每种文化期望的最佳尝试,正如Basil Bourque所说,它们经常引起争议。通常,我建议您相信CLDR比您更了解不同文化的期望,毕竟它们已经做了您永远无法独自做出的努力。另一方面,您会更好地了解自己的用户,为了满足我们自己的用户的需要,我们需要硬编码不同于内置格式的格式,这并不少见。