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

时间:2011-04-06 10:01:34

标签: java date-format simpledateformat

您好我已经设置了一个使用自定义格式字符串的简单日期格式: MMDDYY

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

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

4月4日0001AD

任何想法为什么?

3 个答案:

答案 0 :(得分:10)

这是预期的行为 - 你告诉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天。

答案 1 :(得分:2)

解析模式的大小(重复字符数)不是相应文本的预期大小。来自javadoc,针对不同的相关演示文稿类型:

  
      
  • 数字:对于解析,模式字母的数量为忽略,除非需要将两个相邻的字段分开。
  •   
  • :在解析过程中,只有正好两位数 [...]的字符串才会被解析为默认世纪。 任何其他数字字符串,例如一位数字符串,三位或更多位数字符串,或不是所有数字的两位数字符串(例如“-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 :(得分:0)

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