获取原始模式字符串给定JDK 8 DateTimeFormatter?

与我的问题相关 – 如何获得给定DateTimeFormatter的原始pattern字符串?

它已在邮件列表中被询问,答案是不可能,因为原始模式不会被保留。

同一个线程建议使用具有该信息的DateTimeFormatterBuilder

这不是一个简单或优雅的解决方案,但使用DateTimeFormatter.toString()方法的结果,可能会滚动自己的代码来解析生成的String并重建原始模式。

一些打印一些.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() ); 

结果(注意空格/连字符/斜杠/冒号分隔符的保留):

测试1:ReducedValue(YearOfEra,2,2,2000-01-01)”Value(MonthOfYear,2)”Value(DayOfMonth,2)

测试2:ReducedValue(YearOfEra,2,2,2000-01-01)’ – ‘Value(MonthOfYear,2)’ – ‘Value(DayOfMonth,2)

测试3:ReducedValue(YearOfEra,2,2,2000-01-01)值(MonthOfYear,2)Value(DayOfMonth,2)

测试4:值(MonthOfYear,2)’/’Value(DayOfMonth,2)’/’Value(YearOfEra,4,19,EXCEEDS_PAD)”Value(HourOfDay,2)’:’Value(MinuteOfHour,2)’: “值(SecondOfMinute,2)

实现这种方法需要研究java.time.format.DateTimeFormatterBuilder的代码。 appendPattern(String pattern)方法的JavaDoc似乎特别有用。 如果您知道只使用几种类型的模式,则可以采用一些快捷方式。

快速浏览一下DateTimeFormatterBuilder代码,可能存在依赖此类解决方案的风险,因为在未来的Java版本中,诸如ValueReducedValueFraction等字符串可能会在没有通知的情况下发生变化。

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

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

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

这将为您提供一个字符串模式。