咨询Java中SimpleDateFormat解析yyyy-MM-dd格式的有效日期范围
Java中SimpleDateFormat解析yyyy-MM-dd的日期范围限制
为什么最大有效日期是4637-11-25而非9999-12-31?
SimpleDateFormat本身没有独立的日期范围限制,它完全依赖底层默认的GregorianCalendar处理日期。而GregorianCalendar用long类型存储时间戳,long的最大值是9223372036854775807(2的63次方减1),这个值对应的具体日期就是你测试到的4637-11-25——该日期会因所在时区略有差异,比如UTC时区下对应4638-01-01,东八区则会提前到4637年11月。
9999-12-31对应的时间戳已经超过long的容纳上限,所以SimpleDateFormat解析时会直接报错。
关于最小有效日期
GregorianCalendar能表示的最小时间戳是-9223372036854775808,对应公元前292278994年左右的日期,但解析这类极早日期可能因历法转换(儒略历转格里高利历)出现异常;像1900-01-01这类近代日期则可以正常解析。
要支持9999-12-31怎么办?
如果需要处理超大范围日期,别用SimpleDateFormat了,直接用Java 8及以后的java.time包,比如LocalDate和DateTimeFormatter。这些类不依赖long时间戳,支持的日期范围从公元前999999999年到公元999999999年,轻松覆盖9999-12-31的需求。示例代码:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate maxDate = LocalDate.parse("9999-12-31", formatter);
内容的提问来源于stack exchange,提问作者Trowa
相关产品推荐
相关产品推荐

