Дата ввода 03 января, но возвращается 02 января, почему? - PullRequest
2 голосов
/ 27 марта 2012
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();
}

out:

opDate: вт 03 января 00:00:00 MSK 2006

дата: 20060102

Почему этовернуть 02 января?

Ответы [ 5 ]

8 голосов
/ 27 марта 2012

Проблема в получении часового пояса "Russia/Moscow".Правильный идентификатор зоны: "Europe/Moscow".Измените идентификатор, и проблема исчезнет:

df.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));

К сожалению, TimeZone.getTimeZone("random rubbish") возвращает часовой пояс UTC вместо того, чтобы сообщать вам каким-либо образом, что он неисправен.

5 голосов
/ 27 марта 2012

Вероятно, из-за преобразования часового пояса.Я бы посоветовал вам также напечатать время и часовой пояс вашей итоговой даты.Это может быть 2 января, 23:00 или что-то в этом роде.

Это происходит потому, что вы установили другой часовой пояс на SimpleDataFormat.

3 голосов
/ 27 марта 2012

Часовые пояса.

Вы указываете полночь 3 января в мск . 2 января в 9:00 по Гринвичу (вероятный часовой пояс по умолчанию).

Я вижу, что вы пытаетесь выводить также и по московскому времени, но Russia/Moscow не является действительным часовым поясом, и getTimeZone вызывает "услужливо" по умолчанию, по умолчанию возвращая GMT . Это тогда, конечно, не меняет часовой пояс даты при форматировании и выводит его как 2 января.

Если вы установите часовой пояс на Europe/Moscow, вы получите ожидаемый результат.

2 голосов
/ 27 марта 2012

Может ли это быть связано с тем, что вы конвертируете даты между двумя разными часовыми поясами?

1 голос
/ 27 марта 2012

Если вы измените строку:

String date = convertDate(opDate, "yyyyMMdd");

до:

String date = convertDate(opDate, "EEE MMM dd HH:mm:ss zzz yyyy");

вы можете увидеть вывод вашей программы:

opDate: Tue Jan 03 00:00:00 MSK 2006
date: Mon Jan 02 20:00:00 GMT 2006

Вы плохо настраиваете TimeZone с помощью:

df.setTimeZone(TimeZone.getTimeZone("Russia/Moscow"));

вам нужно:

df.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));

Наконец, есть летняя задержка в 1 час.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...