在给定 JDK 8 DateTimeFormatter 的情况下获取原始模式字符串?

Get original pattern String given a JDK 8 DateTimeFormatter?

与我的问题 相关 - 如何在给定 DateTimeFormatter 的情况下获取原始 pattern 字符串?

问过on the mailing list回答是不可能,因为没有保留原来的模式

同一个线程建议使用 DateTimeFormatterBuilder,它确实有信息。

这可能不是您问题的直接答案,但可能会有所帮助。

如果您知道格式化程序的构造参数,您可以调用静态方法:

DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle dateStyle, FormatStyle timeStyle, Chronology chrono, Locale locale)

这将为您提供字符串形式的模式。

这不是一个简单或优雅的解决方案,但使用 DateTimeFormatter.toString() 方法的结果,可能会推出您自己的代码来解析结果字符串并重建原创图案。

一些代码为各种模式打印一些 .toString() 结果:

java.time.format.DateTimeFormatter variousFormatPatterns =
    java.time.format.DateTimeFormatter.ofPattern("yy MM dd");
System.out.println("Test 1: " + variousFormatPatterns.toString() );

variousFormatPatterns = java.time.format.DateTimeFormatter.ofPattern("yy-MM-dd");
System.out.println("\nTest 2: " + variousFormatPatterns.toString() );

variousFormatPatterns = java.time.format.DateTimeFormatter.ofPattern("yyMMdd");
System.out.println("\nTest 3: " + variousFormatPatterns.toString() );

variousFormatPatterns = java.time.format.DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
System.out.println("\nTest 4: " + variousFormatPatterns.toString() );

结果(注意保留space/hyphen/slash/colon分隔符):

Test 1: ReducedValue(YearOfEra,2,2,2000-01-01)' 'Value(MonthOfYear,2)' 'Value(DayOfMonth,2)

Test 2: ReducedValue(YearOfEra,2,2,2000-01-01)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)

Test 3: ReducedValue(YearOfEra,2,2,2000-01-01)Value(MonthOfYear,2)Value(DayOfMonth,2)

Test 4: Value(MonthOfYear,2)'/'Value(DayOfMonth,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)

实施此方法需要研究 java.time.format.DateTimeFormatterBuilder 中的代码。 appendPattern(String pattern) 方法的 JavaDoc 似乎特别有用。如果您知道自己只使用几种类型的模式,您也许可以走一些捷径。

快速浏览 DateTimeFormatterBuilder 代码,依赖此类解决方案可能存在风险,因为 ValueReducedValue、[=19 等字符串=], 等等可能会在未来的 Java 版本中更改,恕不另行通知。