You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 5中使用SimpleDateFormat解析02-Mar-00日期失败求助

解决Java 5中"02-Mar-00"日期解析失败的问题

这个问题的核心是格式字符串和输入日期的年份位数不匹配,再加上setLenient(false)的严格校验触发了异常。我来一步步帮你解决:

问题根源

你使用的格式是dd-MMM-yyyy(要求四位年份),但输入的日期字符串是02-Mar-00(两位年份)。当SimpleDateFormat遇到这种情况时,会把00当作四位年份0000来解析——而公历中根本不存在公元0年,在严格模式(setLenient(false))下,这种无效年份直接触发了ParseException。

解决方案

1. 修正格式字符串(核心步骤)

把格式字符串改成dd-MMM-yy,明确告诉解析器要处理两位年份:

String dateFormat = "dd-MMM-yy";
DateFormat df = new SimpleDateFormat(dateFormat);
df.setLenient(false);
Date date = df.parse("02-Mar-00");
// 解析结果为2000年3月2日

2. 显式指定Locale(避免跨环境问题)

如果你的系统默认Locale不是英文,Mar这个英文月份缩写可能无法被识别。为了保证兼容性,建议显式指定英文Locale:

DateFormat df = new SimpleDateFormat("dd-MMM-yy", Locale.ENGLISH);
df.setLenient(false);
Date date = df.parse("02-Mar-00");

3. 自定义两位年份的解析范围(可选)

Java 5中SimpleDateFormat默认的两位年份解析窗口是1970-2069(即00-69对应2000-2069,70-99对应1970-1999)。如果需要调整这个范围,可以通过set2DigitYearStart方法自定义:

// 设置两位年份起始为2000年,所有两位年份都会解析为2000-2099
df.set2DigitYearStart(new GregorianCalendar(2000, Calendar.JANUARY, 1).getTime());

这样修改后,02-Mar-00就能被正确解析为2000年3月2日,同时严格模式依然会校验日期的合法性(比如拒绝30-Feb-2000这种无效日期)。

内容的提问来源于stack exchange,提问作者ash164

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:17:02