TL;DR:我如何从区域设置和短/中/长等到模式字符串来解析日期。
完整版本:
访问特定于区域设置的日期格式的模式似乎是 Java 中没有很好解决的问题。
这是在以下背景下
由于第一个问题的 JDK 特定性和第二个问题的实现特定性,我将这个问题带回来,这次以非特定于版本的方式回答,距 2017 年很久之后(日期第一个问题):
使用案例:
在用户界面上,显示输入时将用于解析日期的日期格式:例如,对于Locale.USdisplay start date (M/d/yy),用于在输入旁边Locale.GERMANY显示(或者在 HTML 中,作为占位符)。Startdatum (dd.MM.yy)
只要它仍然有效,实现这一点是微不足道的
DateFormat usFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
DateFormat deFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMANY);
System.out.println(((SimpleDateFormat) usFormat).toPattern()); // M/d/yy
System.out.println(((SimpleDateFormat) deFormat).toPattern()); // dd.MM.yy
Run Code Online (Sandbox Code Playgroud)
但这段代码涉及旧的 API 和特定于实现的类型转换 - 两者都是我不太有信心使用的假设。
维护我自己的特定于区域设置的模式库似乎更不明智,但由于 DateTime API 不授予对其内部模式的任何访问权限(它们必须在那里):
有没有一种方法能够以面向未来的方式解决这个问题?
由于上面的链接问题,这可能涉及特定的最小 Java 版本,这很好。我目前仍然必须兼容 8 和 11,但这可以进一步推动版本,或者为在较新的 Java 版本下运行的实例提供替代的面向未来的实现。
您可以使用DateTimeFormatterBuilder来获取格式字符串:
String usFormat = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT, null, IsoChronology.INSTANCE, Locale.US);
String deFormat = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT, null, IsoChronology.INSTANCE, Locale.GERMANY);
System.out.println(usFormat); // M/d/yy
System.out.println(deFormat); // dd.MM.yy
Run Code Online (Sandbox Code Playgroud)