解析简单日期格式,然后格式化日期不匹配

时间:2013-04-27 09:50:10

标签: java date datetime

我遇到了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月?

1 个答案:

答案 0 :(得分:2)

嗯,这里有两个方面:

  • 模式E d YYYY kk:mm:ss根本不包含月份指标。因此格式化为“Sat 27 2013 13:48:07”之后,您对整个月份解析部分有何期待?
  • 您的所有模式都使用YYYY,这是一周,而不是日历年。这应该通常与“星期几,星期一周”模式一起使用。如果您改用yyyy,最终模式将起作用。

第一个模式出现的唯一原因是你实际上并没有设置除“星期几”和年份(当然还有时间)以外的任何东西。如果您打印出parsedFormattedNow(没有其他格式),您将看到解析结果实际上是1月5日。只是你没有注意到它,因为它仍然是星期六。