当格式设置为 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
替换为 yy
或 y
,则解析应将 98 解释为 1998。如果需要 4 位数日期,则需要添加一些验证码来执行那。
请注意,setLenient
不会影响此处的任何内容,因为每个位置的值都是合法的。您不需要在年份位置有 4 位数字(也不限于 4 位数字)。如果解释不宽松并且您将其传递给“1998/04/12”,它将抛出异常,因为 1998 不在 1-12 的范围内。如果你设置 lenient 那么它会 mod 值以使其进入范围(1998 变为 6)并向前冲锋。由于年份没有实际界限,因此它对年份位置没有影响。
如果我有这个:
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
替换为 yy
或 y
,则解析应将 98 解释为 1998。如果需要 4 位数日期,则需要添加一些验证码来执行那。
请注意,setLenient
不会影响此处的任何内容,因为每个位置的值都是合法的。您不需要在年份位置有 4 位数字(也不限于 4 位数字)。如果解释不宽松并且您将其传递给“1998/04/12”,它将抛出异常,因为 1998 不在 1-12 的范围内。如果你设置 lenient 那么它会 mod 值以使其进入范围(1998 变为 6)并向前冲锋。由于年份没有实际界限,因此它对年份位置没有影响。