11

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

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

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

公元 0001 年 4 月 4 日

任何想法为什么?

4

3 回答 3

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 天。

于 2011-04-06T10:44:18.497 回答
2

用于解析模式的大小(重复字符数)不是相应文本的预期大小。从 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
于 2011-04-06T14:05:16.967 回答
0

2 位数的年份是不明确的 - 因此假设 0001 - 第一年将在 01 结束。你可以转换为 4 位数的年份 - 也许使用字符串操作?

于 2011-04-06T10:11:45.837 回答