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

问题描述:

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

嘛,有两个方面的位置:

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

,第一图案出现工作的唯一原因是,你实际上并不设置(当然和时间)比“一周中的一天”和今年其他任何东西。如果你打印出parsedFormattedNow(没有其他格式),你会看到解析结果实际上是1月5日。只是你没有注意到它,因为它仍然是一个星期六。

+0

是的,先生,你是绝对正确的。 +1并被接受。 – execc 2013-04-27 09:57:22