输入日期1月03日但是返回1月02日,为什么?

Vex*_*toR 2 java date

public static void main(String[] args) {
    String opDate = "Tue Jan 03 00:00:00 MSK 2006";
    String date = convertDate(opDate, "yyyyMMdd");

    System.out.println("opDate: " + opDate);
    System.out.println("date: " + date);
}

public static String convertDate(String opDate, String dateFormat) {
    Date date = new Date();
                                                    //  Mon Jan 02 00:00:00 MSK 2006
    SimpleDateFormat dateParser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);

    try {
        date = dateParser.parse(opDate);
    } catch (Exception e) {
        System.out.println("exception = " + e.toString());
    }

    SimpleDateFormat df = new SimpleDateFormat(dateFormat);
    df.setTimeZone(TimeZone.getTimeZone("Russia/Moscow"));
    String strDate = df.format( date.getTime() );

    return strDate.trim();
}
Run Code Online (Sandbox Code Playgroud)

出:

opDate:Tue Jan 03 00:00:00 MSK 2006

日期:20060102

为什么它会在1月02日返回?

Jon*_*eet 8

问题是获取"Russia/Moscow"时区.正确的zoneinfo ID是"Europe/Moscow".更改ID,问题就消失了:

df.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
Run Code Online (Sandbox Code Playgroud)

遗憾的是,TimeZone.getTimeZone("random rubbish")返回UTC时区而不是让你以某种方式知道它已被破坏.


Ste*_*ote 5

可能是由于时区转换.我建议你也打印结果日期的时间和时区.这可能是1月2日23:00或其他什么.

这是因为你在上面设置了一个不同的时区SimpleDataFormat.