您好我已经设置了一个使用自定义格式字符串的简单日期格式: MMDDYY
我给它以下值来解析: 4 1 01
我不认为它应解析这个因为空格但简单日期格式返回日期
4月4日0001AD
任何想法为什么?
答案 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位数 - 可能使用字符串操作吗?