java中有没有一种方法可以将字符串转换为mmddyyyy或mddyyyy的日期?

qlzsbp2j  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(361)

我试着把字符串转换成日期。其中一些显示如下: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)

因此,正如您所见,上述解决方案适用于第一个格式化日期,但不适用于第二个格式化日期。如果你有什么想法,请告诉我。
提前谢谢!詹姆斯

oo7oh9g9

oo7oh9g91#

你在正确的轨道上。这样做有效:

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

我不知道为什么它在通过格式模式指定月份和年份时不起作用,但是它不起作用,我以前见过。
除此之外,邻接值解析的经验法则(解析数字日期时间字段时,字段之间没有分隔符)是,除了第一个字段外,您需要指定每个字段的确切宽度。然后格式化程序计算字符串后端的宽度,找出第一个值(这里是月份)要使用多少位。所以你的用例非常适合。

相关问题