当格式设置为 dd/mm/yyyy 时,SimpleDateFormat 似乎允许 yy 年

SimpleDateFormat seems to allow a year of yy when the format is set to dd/mm/yyyy

如果我有这个:

private static final String DATE_FORMAT = "dd/MM/yyyy";
DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
formatter.setLenient(false);
formatter.parse("01/01/98");

如果传入两位数的年份,我的应用程序是否应该抛出异常?这个好像没什么问题。

没有。 SimpleDateFormat 用于从字符串解析日期和从日期生成字符串。格式 String 的解释因这些用法而异。在您的情况下,您正在从字符串中解析日期。 98 是合法值,按字面解释(即公元 98 年),因为您使用的是 yyyy。如果将 yyyy 替换为 yyy,则解析应将 98 解释为 1998。如果需要 4 位数日期,则需要添加一些验证码来执行那。

请注意,setLenient 不会影响此处的任何内容,因为每个位置的值都是合法的。您不需要在年份位置有 4 位数字(也不限于 4 位数字)。如果解释不宽松并且您将其传递给“1998/04/12”,它将抛出异常,因为 1998 不在 1-12 的范围内。如果你设置 lenient 那么它会 mod 值以使其进入范围(1998 变为 6)并向前冲锋。由于年份没有实际界限,因此它对年份位置没有影响。