为什么SimpleDateFormat会更改日期?

crm*_*ham 4 java formatting date simpledateformat

给出以下代码:

[...]

    public void testFormatDateString() throws ParseException {

        String dateString = new java.util.Date().toString();

        System.out.println(dateString);

        SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z YYYY", Locale.ENGLISH);

        Date date = format.parse(dateString);

        System.out.println(date.toString());
    }

[...]
Run Code Online (Sandbox Code Playgroud)

之前: Sat Aug 19 18:26:11 BST 2017

后: Sat Jan 07 17:26:11 GMT 2017

为什么日期改变了?

Mar*_*vin 9

大写Y"周年",它有364或371天而不是通常的365或366.小写y(使用的是Date#toString)一切都按预期工作:

public void testFormatDateString() throws ParseException {

    String dateString = new java.util.Date().toString();

    System.out.println(dateString);

    // Force to Locale.US as this is hardcoded in Date#toString
    SimpleDateFormat format = new SimpleDateFormat(
            "EEE MMM dd HH:mm:ss z yyyy", Locale.US);

    Date date = format.parse(dateString);

    System.out.println(date.toString());
}
Run Code Online (Sandbox Code Playgroud)

输出:

Sat Aug 19 17:50:39 GMT 2017
Sat Aug 19 17:50:39 GMT 2017
Run Code Online (Sandbox Code Playgroud)

请参阅ideone.com

正如评论中所提到的,确保Locale.US在解析时包含dateString,因为它是硬编码的Date#toString.有关详情,请参阅此问题.