嗨,我有一个使用自定义格式字符串设置的简单日期格式:MMddyy
我给它解析以下值:4 1 01
我认为它不应该因为空格而解析它,但简单日期格式正在返回日期
公元 0001 年 4 月 4 日
任何想法为什么?
嗨,我有一个使用自定义格式字符串设置的简单日期格式:MMddyy
我给它解析以下值:4 1 01
我认为它不应该因为空格而解析它,但简单日期格式正在返回日期
公元 0001 年 4 月 4 日
任何想法为什么?
这是预期的行为 - 您告诉 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:对于解析,模式字母的数量被忽略,除非需要分隔两个相邻的字段。
- Year:在解析过程中,只有恰好包含两位数字[…] 的字符串才会被解析为默认世纪。任何其他数字字符串,例如一位数字字符串、三位或更多数字字符串或并非全为数字的两位数字字符串(例如,“-1”),都按字面意思解释。所以“01/02/3”或“01/02/003”被解析,使用相同的模式
- Month:如果模式字母的数量为 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 位数的年份 - 也许使用字符串操作?