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
相关产品推荐
相关产品推荐

