gpt4 book ai didi

java - 带有文字且没有分隔符的 DateTimeFormatter 模式不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 02:38:55 25 4
gpt4 key购买 nike

DateTimeFormatter.ofPattern 生成的解析器表现出以下有趣的行为,这使我无法编写模式来解析像 20150100 这样的字符串:

System.out.println(DateTimeFormatter.ofPattern("yyyyMM").parse("201501", YearMonth::from)); // works
System.out.println(DateTimeFormatter.ofPattern("yyyyMM'aa'").parse("201501aa", YearMonth::from)); // works
System.out.println(DateTimeFormatter.ofPattern("yyyyMM'00'").parse("20150100", YearMonth::from));
// java.time.format.DateTimeParseException: Text '20150100' could not be parsed at index 0

我调试了代码,问题似乎是年字段解析超出了字符串的末尾(三个 y 及以上的最大宽度始终为 19)。但是,我不明白它如何适用于末尾没有 '00' 文字的模式。

有什么方法可以解决这个问题而不必使用格式化程序生成器吗?

编辑:

由于下面的 Jarrod 确认它有错误,我进行了更多的谷歌搜索,最终找到了错误报告:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8031085

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8032491

两者都只在 Java 9 中修复了......

最佳答案

DateTimePrinterParser 中存在错误:

我一路调试它,显然你不能将数字作为文字。类似的测试代码证明了这一点,如果您一直逐步调试到 DateTimeFormatterBuilder.parse() 方法,您可以看到它做错了什么。

显然,Value(YearOfEra,4,19,EXCEEDS_PAD) 解析器消耗 00,如果这些不是 数字,它们就会停止,因为它正在寻找 419 位长的数字。嵌入在 DateTimeParseContext 中的 DateTimeFormatter 是错误的。

如果你输入一个像 xx 这样的非数字字符字面量,它会起作用,而数字字面量则不行。

这两个都失败了:

final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM'00'");
System.out.println(sdf.parse("20150100"));

Exception in thread "main" java.text.ParseException: Unparseable date: "20150100" at java.text.DateFormat.parse(DateFormat.java:366)

final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMM'00'");
System.out.println(dateTimeFormatter.parse("20150100", YearMonth::from));

Exception in thread "main" java.time.format.DateTimeParseException: Text '20150100' could not be parsed at index 0 at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)

这两个都成功了:

final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM'xx'");
System.out.println(sdf.parse("201501xx"));

Thu Jan 01 00:00:00 EST 2015

final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMM'xx'");
System.out.println(dateTimeFormatter.parse("201501xx", YearMonth::from));

2015-01

关于java - 带有文字且没有分隔符的 DateTimeFormatter 模式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39150071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com