我试着把字符串转换成日期。其中一些显示如下: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)
因此,正如您所见,上述解决方案适用于第一个格式化日期,但不适用于第二个格式化日期。如果你有什么想法,请告诉我。
提前谢谢!詹姆斯
1条答案
按热度按时间oo7oh9g91#
你在正确的轨道上。这样做有效:
输出为:
我不知道为什么它在通过格式模式指定月份和年份时不起作用,但是它不起作用,我以前见过。
除此之外,邻接值解析的经验法则(解析数字日期时间字段时,字段之间没有分隔符)是,除了第一个字段外,您需要指定每个字段的确切宽度。然后格式化程序计算字符串后端的宽度,找出第一个值(这里是月份)要使用多少位。所以你的用例非常适合。