1

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

4

1 回答 1

2

嗯,这里有两个方面:

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

第一种模式似乎起作用的唯一原因是,除了“星期几”和年份(当然还有时间)之外,您实际上没有设置任何其他内容。如果您打印出来parsedFormattedNow(没有其他格式),您会看到解析结果实际上是 1 月 5 日。只是你没有注意到它,因为它仍然是一个星期六。

于 2013-04-27T09:54:33.240 回答