我遇到了SimpleDateFormat的奇怪行为,我不知道如何处理。
我需要以特定格式解析日期(星期几,然后是天,然后是月,然后是年,然后是时间)。 但是,我遇到了一个行为,当解析一个日期给我一个非常严格的结果(其他日期)。这是一个小型,自包含的示例,它在我的机器上输出。
public static void main(String[] args) throws Exception {
test("E YYYY kk:mm:ss");
test("E d YYYY kk:mm:ss");
test("E d MMMM YYYY kk:mm:ss");
}
public static void test(String format) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date now = new Date();
System.out.println(now);
String formattedNow = sdf.format(now);
System.out.println(formattedNow);
Date parsedFormattedNow = sdf.parse(formattedNow);
String formattedParsedNow = sdf.format(parsedFormattedNow);
System.out.println(formattedParsedNow);
System.out.println(formattedNow.equals(formattedParsedNow));
}
输出:
Sat Apr 27 13:48:07 MSK 2013
Sat 2013 13:48:07
Sat 2013 13:48:07
true
Sat Apr 27 13:48:07 MSK 2013
Sat 27 2013 13:48:07
Sat 5 2013 13:48:07
false
Sat Apr 27 13:48:07 MSK 2013
Sat 27 April 2013 13:48:07
Sat 5 January 2013 13:48:07
false
为什么27变成5,4月变换到1月?
答案 0 :(得分:2)
嗯,这里有两个方面:
E d YYYY kk:mm:ss
根本不包含月份指标。因此格式化为“Sat 27 2013 13:48:07”之后,您对整个月份解析部分有何期待?YYYY
,这是一周,而不是日历年。这应该通常与“星期几,星期一周”模式一起使用。如果您改用yyyy
,最终模式将起作用。第一个模式出现的唯一原因是你实际上并没有设置除“星期几”和年份(当然还有时间)以外的任何东西。如果您打印出parsedFormattedNow
(没有其他格式),您将看到解析结果实际上是1月5日。只是你没有注意到它,因为它仍然是星期六。