【问题标题】:Is it possible to parse dates with both TextStyle.SHORT and TextStyle.FULL for the month?是否可以使用 TextStyle.SHORT 和 TextStyle.FULL 来解析当月的日期?
【发布时间】:2015-12-09 00:48:00
【问题描述】:

d. MMM u 这样的模式创建的 Java 8 DateTimeFormatter 只能解析以 TextStyle.SHORT 定义的样式(例如 13. Feb 2015)编写的日期,从 d. MMMM u 创建的 DateTimeFormatter 只能解析以 TextStyle.FULL 定义的样式(例如 13. February 2015)书写月份的日期。

在“旧”的 SimpleDateFormat 中,“MMM”和“MMMM”之间的区别仅对格式化很重要,对解析不重要,因此很容易创建一个同时理解月份的 FULL 和 SHORT 形式的解析器名字。

是否可以创建一个 Java 8 DateTimeFormatter 也可以做到这一点?还是我总是必须创建两个解析器,一个使用 FULL 模式,一个使用 SHORT 模式?

【问题讨论】:

    标签: java date parsing java-8 java-time


    【解决方案1】:

    您可以将不同的 month 模式设为可选:

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d. [MMMM][MMM] u HH:mm:ss z", Locale.US);
    
        ZonedDateTime zdt1 = ZonedDateTime.parse("4. Jan 2015 00:00:00 UTC", formatter);
        ZonedDateTime zdt2 = ZonedDateTime.parse("4. January 2015 00:00:00 UTC", formatter);
    
        System.out.println(zdt1);
        System.out.println(zdt2);
    

    输出:

    2015-01-04T00:00Z[UTC]
    2015-01-04T00:00Z[UTC]
    

    编辑

    此格式化程序只能用于parse(),您必须为format() 使用不同的格式化程序。

    【讨论】:

    • 好吧,我看到的唯一缺点是它现在可以解析像“15. JanuaryJan 2015”这样的“损坏”字符串,但这并不是一个大问题。仍然不确定是否拥有两个格式化程序/解析器可能不是更优雅的解决方案......
    • @David 我会说如果你只有两个,那么你选择哪种解决方案并不重要。但是,如果您可能需要解析更多类型的格式,您可能应该选择一个解析器和一个格式化程序(您甚至可以嵌套可选部分)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多