首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSR310 Year.parse()抛出值< 1000的DateTimeParseException

JSR310 Year.parse()抛出值< 1000的DateTimeParseException
EN

Stack Overflow用户
提问于 2020-05-20 07:32:11
回答 2查看 124关注 0票数 5

我试图用java.time.Year.parse()解析介于0到1000之间的年份字符串值,但是java.time.format.DateTimeParseException: Text '999' could not be parsed at index 0的解析失败。

Year.parse的javadoc声明:

代码语言:javascript
复制
Obtains an instance of Year from a text string such as 2007. 
The string must represent a valid year. Years outside the range 0000 to 9999 
must be prefixed by the plus or minus symbol.

重现此问题的示例测试:

代码语言:javascript
复制
@Test
public void parse_year() {
   for (int i = 2000; i >= 0; i--) {
      System.out.println("Parsing year: " + i);
      Year.parse(String.valueOf(i));
   }
}

当达到年份999时,测试抛出异常:

代码语言:javascript
复制
Parsing year: 1003
Parsing year: 1002
Parsing year: 1001
Parsing year: 1000
Parsing year: 999
java.time.format.DateTimeParseException: Text '999' 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)
    at java.time.Year.parse(Year.java:292)
    at java.time.Year.parse(Year.java:277)
[...]

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-20 07:36:08

需要填充到4位数

代码语言:javascript
复制
Year.parse(String.format("%04d", i));

Parsing year: 2000
Parsing year: ....
Parsing year: 4
Parsing year: 3
Parsing year: 2
Parsing year: 1
Parsing year: 0

如果你想在0岁之前解析,你可以用

代码语言:javascript
复制
Year.parse("-0001");
票数 4
EN

Stack Overflow用户

发布于 2020-05-20 19:51:42

您已经在java.time中发现了一个非常奇怪的不一致性。

首先,对于你所观察到的行为,我认为这是合理的。java.time类通常解析最常见的ISO8601格式变体。一年的ISO 8601格式是(来自维基百科,链接在底部):

ISO 8601至少规定了四位数的YYYY年,以避免2000年问题.因此,它代表从0000到9999的年份,而年份等于公元前1和所有其他AD。

因此,尽管您引用的Year.parse()文档并不十分清楚,但至少4位数的要求来自于ISO8601,当然是故意的。

java.time的其他类也有相同的要求。

代码语言:javascript
复制
    LocalDate.parse("999-12-31");

线程"main“java.time.format.DateTimeParseException中的异常:无法在索引0处解析文本'999-12-31‘

到目前为止,java.time是一致的。

在我看来,当尝试Year.toString方法时,出现了一个惊喜。toString类的java.time方法通常也会打印ISO8601格式。

代码语言:javascript
复制
    System.out.println(Year.of(999).toString());

产出如下:

999

因此,Year打印的格式不符合ISO8601,更令人惊讶的是,它无法使用其one-arg parse方法解析该格式。这是我从任何java.time类中没有想到的。

如果要解析少于4位数的年份,只需使用格式化程序:

代码语言:javascript
复制
    DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("u");
    System.out.println(Year.parse("999", yearFormatter));
    System.out.println(Year.parse("0", yearFormatter));

999 0

Link

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61907458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档