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

问题描述 投票:0回答:3

与我的问题相关Java 8 DateTimeFormatters 常量在哪里定义? - 如何在给定

pattern
的情况下获取原始
DateTimeFormatter
字符串?

java java-8 datetime-format java-time
3个回答
27
投票

有人问在邮件列表上,答案是不可能,因为没有保留原始模式。

同一条帖子建议使用

DateTimeFormatterBuilder
,它确实有信息。


6
投票

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

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

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

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


2
投票

这不是一个简单或优雅的解决方案,但使用

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() );

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

测试 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)Value(MonthOfYear,2)Value(DayOfMonth,2)

测试 4: Value(MonthOfYear,2)'/'Value(DayOfMonth,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)' :'值(秒数,2)

实现这种方法需要研究

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

快速浏览一下

DateTimeFormatterBuilder
代码,依赖这种类型的解决方案可能存在风险,因为诸如
Value
ReducedValue
Fraction
等字符串可能会在未来的 Java 中更改,恕不另行通知版本。

© www.soinside.com 2019 - 2024. All rights reserved.