如何以经得起未来考验的方式在Java中获得特定于区域设置的日期/时间模式



TL;DR:我如何将具有locale和SHORT/MMEDIUM/LONG等转换为模式String来解析日期。

完整版本:

访问特定于区域设置的日期格式的模式似乎是Java中没有很好地解决的问题。

这是在的背景下

  • JDK8+DateTime API不提供访问,以及
  • 经典的SimpleDateFormat看起来不够经得起未来考验

由于第一个问题的JDK特定性和第二个问题的实现特定性,我将重新提出这个问题,这一次将以非版本特定的方式回答,早在2017年(第一个问题发生的日期(之后:

用例:

在用户界面上,显示输入时解析日期的日期格式:例如,对于Locale.US,显示start date (M/d/yy);对于Locale.GERMANY,在输入旁边显示Startdatum (dd.MM.yy)(或者,在HTML中,作为占位符(。

这将是微不足道的实现-,只要它仍然工作-与

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

但这段代码涉及到旧的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

最新更新