【问题标题】:Get original pattern String given a JDK 8 DateTimeFormatter?在给定 JDK 8 DateTimeFormatter 的情况下获取原始模式字符串?
【发布时间】:2015-05-11 00:47:01
【问题描述】:

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

【问题讨论】:

  • @KevinWorkman 可能不是重复的,因为这是关于 JDK 8 DateTimeFormatter 类,而不是 joda 时间类
  • @bowmore JDK 8 DateTimeFormatter 类基于 JodaTime DateTimeFormatter 类。这个问题的答案就是这个问题的答案。
  • @KevinWorkman 那一个启发了另一个,并没有使它们相同。他们的行为在各个方面都不同。然而,虽然答案可能相同,但问题不是重复的,因为提出问题的人可能不知道两者之间的关系。
  • 我明确指出它是 JDK 8 的。您将此标记为重复的问题是 joda 问题。
  • @KevinWorkman:所以答案是重复的,而不是问题:)

标签: java java-8 datetime-format java-time


【解决方案1】:

这不是一个简单或优雅的解决方案,但使用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 )':'值(SecondOfMinute,2)

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

快速浏览DateTimeFormatterBuilder 代码,可能存在依赖此类解决方案的风险,因为ValueReducedValueFraction 等字符串可能会在不另行通知的情况下更改未来的 Java 版本。

【讨论】:

    【解决方案2】:

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

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

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

    这会将模式作为字符串提供给您。

    【讨论】:

    • 或更简单的:((SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT, Locale.FRENCH)).toPattern()
    【解决方案3】:

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

    同一线程建议使用确实有信息的DateTimeFormatterBuilder

    【讨论】:

    • 我猜DateTimeFormatterBuilder 允许构建本地化格式,但如果我没记错的话,并没有准确给出用于构建DateTimeFormatter 对象的确切格式。
    • @RohitJain 可能就是这种情况 - javadoc 不承诺归还原始模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    相关资源
    最近更新 更多