Jak*_*akg 6 java datetime java.time
我有一些text
仅DateTimeFormatter
在解析样式为Strict
-而不是的情况下才由a 解析Lenient
。
这似乎与我期望的行为相反?
例:
String pattern = "ddMMyyHH:mm:ss";
String text = "02011104:21:32";
System.out.println(MessageFormat.format("Strict - {0}", new DateTimeFormatterBuilder().parseStrict().appendPattern(pattern).toFormatter().parse(text)));
System.out.println(MessageFormat.format("Lenient - {0}", new DateTimeFormatterBuilder().parseLenient().appendPattern(pattern).toFormatter().parse(text)));
Run Code Online (Sandbox Code Playgroud)
输出:
Strict - {},ISO resolved to 2011-01-02T04:21:32
Exception in thread "main" java.time.format.DateTimeParseException: Text '02011104:21:32' could not be parsed at index 8
Run Code Online (Sandbox Code Playgroud)
将此作为错误发布 - https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8228353
我得到以下回复:
根据 DateTimeFormatterBuilder 的规范,appendPattern("yy") 转换为appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2000),其中“2”适用于 with 和 maxWidth。方法说明中写道:
对于严格解析,会解析 width 到 maxWidth 允许的字符数。为了宽松的解析,字符数必须至少为 1 且小于 10。
因此,在这种情况下,在严格模式下,仅读取“yy”的“11”,然后生成基值为 2000 的年份“2011”。但在宽松模式下,“yy”会尝试贪婪地读取“:”之前的内容。并产生年份“1104”,然后解析器尝试用“HH”模式解析“:”时抛出异常。
归档时间: |
|
查看次数: |
76 次 |
最近记录: |