DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, new Locale("SV", "SE"));
((SimpleDateFormat) dateFormat).toPattern();
在Java 8中,这行代码会生成
"yyyy-MM-dd"
,而在Java 9中它会生成"y-MM-dd"
。对于我们的遗留代码来说,这有一些严重的问题,是否有一种方法可以恢复其行为?DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, new Locale("SV", "SE"));
((SimpleDateFormat) dateFormat).toPattern();
"yyyy-MM-dd"
,而在Java 9中它会生成"y-MM-dd"
。对于我们的遗留代码来说,这有一些严重的问题,是否有一种方法可以恢复其行为? System.setProperty("java.locale.providers", "COMPAT,CLDR");
DateFormat dateFormat
= DateFormat.getDateInstance(DateFormat.SHORT, new Locale("sv", "SE"));
System.out.println(((SimpleDateFormat) dateFormat).toPattern());
-D
设置属性,这不会有任何区别。sv
以确保不会混淆读者。
有人可能会想知道模式中是有一个 y
还是四个 y
是否有任何区别。根据我对 SimpleDateFormat
文档的理解,一个 y
将根据80-20规则解释2位数的年份:它在过去80年或未来20年内。yyyy
将把2位数的年份解释为公元1世纪的年份。假设你的年份范围在4位数范围内(1000到9999),我不认为这会成为问题。
如果这只针对瑞典语环境,那么现代版本的代码将给出相同的结果:
DateTimeFormatterBuilder.getLocalizedDateTimePattern(
FormatStyle.SHORT, null, IsoChronology.INSTANCE, new Locale("SV", "SE")));
en-CY
),DateFormat
和DateTimeFormatter
的结果不同。因此,如果您的目标是最大限度地确保向后兼容性,请使用过时的DateFormat
类。new Locale("sv", "SE")
? - Basil Bourquenew Locale("SV", "SE").equals(new Locale("sv", "SE"))
返回 true
,所以我认为这并不重要。@BasilBourque - Ole V.V.
"yyyy-MM-dd"
,只需使用字符串"yyyy-MM-dd"
。如果你询问一个工厂获取某个区域和样式的模式,那么你必须接受这是一个不断变化的目标。我怀疑瑞典是否愿意仅仅为了一些遗留的Java代码而固定他们的日期格式... - HolgerSimpleDateFormat
?我可以理解如果你现在不想从遗留代码中删除它,但对于手头的任务,请使用DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT, null, IsoChronology.INSTANCE, new Locale("SV", "SE"))
(虽然这并不能解决你的问题,因为它在Java 8和9中的行为也有所不同)。 - Ole V.V.