java - Java 有没有办法将字符串转换为 MMddyyyy 或 Mddyyyy 日期?

标签 java java-time date-parsing date

我一直在尝试将字符串转换为日期。其中一些显示如下:1011970(如1970年1月1日),有些显示如下:10011970(如1970年10月1日)。月初这个事实给我带来了一个大问题。

我已经想出了解决方案,我可以只检查数字有多少位并使用单独的格式化程序,但我更喜欢使用更优雅的东西。我一直在尝试使用 DateTimeFormatterBuilder 创建一个“一刀切”的格式化程序。 这是我尝试过的示例以及我得到的输出。

        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendValue(ChronoField.MONTH_OF_YEAR, 1, 2, SignStyle.NORMAL)
            .appendPattern("ddyyyy")
            .toFormatter();

        System.out.println(LocalDate.parse("10011970", formatter));
        System.out.println(LocalDate.parse("1011970", formatter));
Date: 1970-10-01                                                                                                       
Exception in thread "main" java.time.format.DateTimeParseException: Text '1011970' could not be parsed at index 4      
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)                              
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)                                       
        at java.time.LocalDate.parse(LocalDate.java:400)                                                               
        at Main.main(Main.java:36) 

正如您所看到的,上述解决方案适用于第一个格式化日期,但不适用于第二个。 如果您有任何想法,请告诉我。

提前致谢! 詹姆斯

最佳答案

你走在正确的道路上。这有效:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendValue(ChronoField.MONTH_OF_YEAR)
            .appendValue(ChronoField.DAY_OF_MONTH, 2)
            .appendValue(ChronoField.YEAR, 4)
            .toFormatter();

    System.out.println(LocalDate.parse("10011970", formatter));
    System.out.println(LocalDate.parse("1011970", formatter));

输出是:

1970-10-01
1970-01-01

我不知道为什么它在通过格式模式指定年月日时不起作用,但它不起作用,我以前见过。

除此之外,相邻值解析(解析数字日期时间字段之间没有分隔符)的经验法则是,您需要指定除第一个字段之外的每个字段的精确宽度。然后格式化程序从字符串的后端计算宽度,以找出第一个值(此处为月份)使用多少个数字。所以您的用例非常适合。

关于java - Java 有没有办法将字符串转换为 MMddyyyy 或 Mddyyyy 日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60216925/

相关文章:

Java 并发 : CAS vs Locking

java - Controller 不支持 Spring

java - 使用LocalDateTIme和ZonedDateTime从日期中减去一天后得到错误的结果

Python时区解析

java - DateFormat 解析 - 不返回 UTC 格式的日期

java - List和ArrayList在声明上的区别?

java - 是否可以延迟类的加载,稍后可能会动态加载?

javascript - 2011-11-15 和 2011/11/15 的不同 Date.parse 结果

java - 如何将 java.sql.timestamp 转换为 LocalDate (java8) java.time?

Java 8 日期时间格式日期+偏移量