我想检索当前日期格式。没有格式化日期,我需要的是MM/dd/yyyy
或dd/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
,所以我想知道如何才能检索当前语言环境的模式?
答案 0 :(得分:2)
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 Consortium的Common 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比您更了解不同文化的期望,毕竟它们已经做了您永远无法独自做出的努力。另一方面,您会更好地了解自己的用户,为了满足我们自己的用户的需要,我们需要硬编码不同于内置格式的格式,这并不少见。