为什么Java的SimpleDateFormat会解析这个问题

嗨,我有一个简单的日期格式设置自定义格式字符串:MMddyy

我给它以下值来解析:4 1 01

我不认为它应该解析这个因为空格,但简单日期格式返回日期

4月4日0001AD

任何想法为什么?

这是预期的行为 – 你告诉DateFormat对象期望一个6字符的字符串表示日期,这是你传入的。空格被解析好。 但是,如果您使用“4x1x01”,则会出错。 请注意,解析时,leniency默认为true,例如

 DateFormat df = new SimpleDateFormat("MMddyy"); Date date = df.parse("4 1 01"); // runs successfully (as you know) DateFormat df = new SimpleDateFormat("MMddyy"); Date date = df.parse("41 01"); // 5 character String - runs successfully DateFormat df = new SimpleDateFormat("MMddyy"); df.setLenient(false); Date date = df.parse("41 01"); // 5 character String - causes exception DateFormat df = new SimpleDateFormat("MMddyy"); Date date = df.parse("999999"); // 6 character String - runs successfully DateFormat df = new SimpleDateFormat("MMddyy"); df.setLenient(false); Date date = df.parse("999999"); // 6 character String - causes exception 

当leniency设置为true(默认行为)时,解析会尝试解密无效输入,例如31天月份的第35天成为下个月的第4天。

用于解析模式的大小(重复字符的数量)不是相应文本的预期大小。 从javadoc中,针对不同的相关表示类型:

  • Number :对于解析, 忽略模式字母的数量,除非需要分隔两个相邻的字段。
  • 年份 :在解析过程中,只有正好两位数的字符串才会被解析为默认世纪。 字面上解释任何其他数字字符串,例如一位数字符串,三位或更多位数字符串,或不是所有数字的两位数字符串(例如,“ – 1”)。 所以使用相同的模式解析“01/02/3”或“01/02/003”
  • 月份 :如果模式字母的数量为3或更多,则将月份解释为文本; 否则,它被解释为一个数字。

空格会导致解析器停止解析实际字段 (尾随空格对数字无效)并从下一个开始。 由于模式在这两个字段之间没有空格,因此不会消耗它并且是第二个字段的一部分(前导空格有效)。 因此,得到的年份不是“正好两位数”,并且不会被解析为默认世纪。

解析测试( lenient设置为false ):

 FORMAT TEXT RESULT (ISO yyyy-MM-dd) ------------------------------------------------- dddyy 01011 2011-01-10 dddyy 10 11 0011-01-10 (year is 3 chars: " 11") dddyy 10 1 0001-01-10 (year is 2 char but not 2 digits: " 1") dddy 01011 2011-01-10 ("y" same as "yy") dd yy 10 11 2011-01-10 (ok, whitespace is consumed, year: "11") d/y 3/4 0004-01-03 (year is not 2 digits) d/y 3/04 2004-01-03 M/d/y 4/6/11 2011-04-06 

2位数的年份是模糊的 – 因此它假定为0001 – 第一年将在01结束。你能转换成4位数 – 可能使用字符串操作?