Overwrite DateTimeFormatter 世纪本地化日期样式解析策略
Overwrite DateTimeFormatter localized date style parsing strategy for century
我需要根据语言环境和格式样式动态解析日期字符串。
例如,我有一个阿尔巴尼亚语言环境,其模式为 yy-MM-dd
我有以下代码可以根据当前的语言环境和格式样式解析此模式
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendLocalized(FormatStyle.SHORT, null)
.toFormatter()
.withLocale(Locale.forLanguageTag("sq-AL"));
TemporalAccessor temporalAccessor = formatter.parseBest("92-07-09", LocalDateTime::from, LocalDate::from, LocalTime::from);
System.out.println(temporalAccessor);
输入字符串被解析为09/07/2092
但我需要将此日期解析为 09/07/1992
添加 .appendValueReduced
的代码无效
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendLocalized(FormatStyle.SHORT, null)
.appendValueReduced(ChronoField.YEAR, 2, 2, LocalDate.now().minusYears(80))
.toFormatter()
.withLocale(Locale.forLanguageTag("sq-AL"));
我在 Whosebug 上搜索了答案,但没有找到任何没有 .appendPattern()
并且基于语言环境和格式样式
的答案
提前致谢!
在 的基础上,您可以先从输入字符串中提取模式,如下所示:
String shortPattern =
DateTimeFormatterBuilder.getLocalizedDateTimePattern(
FormatStyle.SHORT,
null,
IsoChronology.INSTANCE,
Locale.forLanguageTag("sqi-AL")
);
System.out.println(shortPattern); //y-MM-d
现在您可以应用带有特定年份说明的格式化程序。由于年份现在由 appendValueReduced
:
处理,因此现在已明确给出模式并删除了 y
s
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern(shortPattern.replaceAll("y","")))
.appendValueReduced(ChronoField.YEAR, 2, 4, LocalDate.now().minusYears(80))
.appendOptional(DateTimeFormatter.ofPattern(shortPattern.replaceAll("y","")))
.toFormatter();
TemporalAccessor temporalAccessor = formatter.parseBest("92-07-09", LocalDate::from, LocalDateTime::from);
System.out.println(temporalAccessor); //1992-07-09
appendOptional
的原因是,如果语言环境模式末尾有年份,可能会导致解析错误。例如,代码中的语言环境模式 (sq-AL
) 实际上是 d.M.yy
。所以我们需要在两端检查年份。
我需要根据语言环境和格式样式动态解析日期字符串。
例如,我有一个阿尔巴尼亚语言环境,其模式为 yy-MM-dd
我有以下代码可以根据当前的语言环境和格式样式解析此模式
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendLocalized(FormatStyle.SHORT, null)
.toFormatter()
.withLocale(Locale.forLanguageTag("sq-AL"));
TemporalAccessor temporalAccessor = formatter.parseBest("92-07-09", LocalDateTime::from, LocalDate::from, LocalTime::from);
System.out.println(temporalAccessor);
输入字符串被解析为09/07/2092
但我需要将此日期解析为 09/07/1992
添加 .appendValueReduced
的代码无效
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendLocalized(FormatStyle.SHORT, null)
.appendValueReduced(ChronoField.YEAR, 2, 2, LocalDate.now().minusYears(80))
.toFormatter()
.withLocale(Locale.forLanguageTag("sq-AL"));
我在 Whosebug 上搜索了答案,但没有找到任何没有 .appendPattern()
并且基于语言环境和格式样式
提前致谢!
在
String shortPattern =
DateTimeFormatterBuilder.getLocalizedDateTimePattern(
FormatStyle.SHORT,
null,
IsoChronology.INSTANCE,
Locale.forLanguageTag("sqi-AL")
);
System.out.println(shortPattern); //y-MM-d
现在您可以应用带有特定年份说明的格式化程序。由于年份现在由 appendValueReduced
:
y
s
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern(shortPattern.replaceAll("y","")))
.appendValueReduced(ChronoField.YEAR, 2, 4, LocalDate.now().minusYears(80))
.appendOptional(DateTimeFormatter.ofPattern(shortPattern.replaceAll("y","")))
.toFormatter();
TemporalAccessor temporalAccessor = formatter.parseBest("92-07-09", LocalDate::from, LocalDateTime::from);
System.out.println(temporalAccessor); //1992-07-09
appendOptional
的原因是,如果语言环境模式末尾有年份,可能会导致解析错误。例如,代码中的语言环境模式 (sq-AL
) 实际上是 d.M.yy
。所以我们需要在两端检查年份。