Дата SimpleDateFormat анализируется неправильно?

Итак, у меня есть код:

String ANNOUNCEMENT_DATE = "Sat, 25-Aug-2014 11:00:00 GMT"; 

DateFormat df = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss z");

Date announcementDate = null;

try {
    announcementDate = df.parse(announcementDateString);
} catch (ParseException e) {
    e.printStackTrace();
}

announcementEpochTime = announcementDate.getTime()/1000;

Итак, как я и ожидал, до 11:00 сегодняшнего дня следующее выражение разрешилось как false:

System.currentTimeMillis()/1000 >= announcementEpochTime

Однако после 11:00:00 я ожидал, что он разрешится как true... но это не так.

Я смотрю на значение fastTime для dateDate, и оно кажется значительно больше, чем текущее системное время, даже сейчас (через 33 минуты).

когда я смотрю на проанализированное объявлениеDate в отладчике, я вижу:

 2014-08-25T12:00:00.000+0100

что мне кажется неправильным. Я уверен, что есть какая-то проблема с часовыми поясами или чем-то в этом роде, но я не могу понять это.

Любая идея, почему моя дата анализируется неправильно?

Я знаю, что во многих случаях эти вещи далеко не тривиальные проблемы, поэтому я надеюсь, что кто-то будет знаком с этими утилитами и быстро обнаружит мою проблему (и сэкономит мне полдня лихорадочного гугления)


person Paul    schedule 25.08.2014    source источник
comment
Может проблема в часовом поясе?   -  person Pphoenix    schedule 25.08.2014
comment
у вас тоже год в строке даты снова перед gmt.. попробуйте это (EEE, dd-MMM-yyyy HH:mm:ss yyyy z);   -  person Sumeet Sharma    schedule 25.08.2014
comment
Вы заметили, что ваш SimpleDateFormat не может анализировать переменную ANNOUNCEMENT_DATE? должно быть EEE, dd-MMM-yyyy HH:mm:ss yyyy z   -  person ortis    schedule 25.08.2014
comment
во-первых, я вижу вашу входную строку для разбора(), и указанная вами строка отличается, и попробуйте использовать Locale в SimpleDateFormat()   -  person SparkOn    schedule 25.08.2014
comment
Деление на 1000 кажется излишним, так как они оба в миллисекундах.   -  person boxed__l    schedule 25.08.2014
comment
@ortis / Sumeet / SparkOn Второй 2014 год в моем формате даты был на самом деле опечаткой, мои извинения. Теперь это исправлено.   -  person Paul    schedule 25.08.2014
comment
@boxed__l да, это для другого расчета позже, я просто пытался превратить то, что у меня было, в убедительный пример проблемы, с которой я столкнулся. Спасибо!   -  person Paul    schedule 25.08.2014


Ответы (3)


Вы, очевидно, живете в Ирландии, где летнее время +1 час летом.

Это означает, что ваше время 12:00 IST соответствует 11:00 GMT. И, следовательно, это означает: Ваше предположение станет верным в 12:00 по местному времени.

Я проверил это с помощью этой небольшой программы и перехода на летнее время +2 часа по Гринвичу (в Германии):

public class Time {
    public static void main(String[] args) {
        String ANNOUNCEMENT_DATE1 = "Mon, 25-Aug-2014 10:00:00 GMT";
        String ANNOUNCEMENT_DATE2 = "Mon, 25-Aug-2014 11:00:00 GMT";

        DateFormat df = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss z", Locale.ENGLISH);

        Date announcementDate1 = null;
        Date announcementDate2 = null;
        try {
            announcementDate1 = df.parse(ANNOUNCEMENT_DATE1);
            announcementDate2 = df.parse(ANNOUNCEMENT_DATE2);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        long now = System.currentTimeMillis();
        System.out.println(now >= announcementDate1.getTime());
        System.out.println(now >= announcementDate2.getTime());
    }
}

Выполнение этого в 12:54 (по местному времени) приводит к следующему выводу:

истинный

ЛОЖЬ

person Seelenvirtuose    schedule 25.08.2014
comment
Итак, основная проблема заключается в том, что GMT не учитывает летнее время? - person Paul; 25.08.2014
comment
GMT просто не знает концепции летнего времени. - person Seelenvirtuose; 25.08.2014
comment
Отлично, ты так попал! Я буду использовать IST и посмотреть, что произойдет. Большое спасибо! :) - person Paul; 25.08.2014

Может быть, ваш шаблон simpledateformat должен быть ("EEE, dd-MMM-yyyy HH:mm:ss yyyy z"), так как у вас есть год до GMT.

person Sumeet Sharma    schedule 25.08.2014
comment
Это была опечатка, извиняюсь. Теперь это исправлено. - person Paul; 25.08.2014

@paul Какое время в вашей системе? Если это GMT, то только ваше сравнение действительно. в противном случае вам также придется учитывать смещение часового пояса при сравнении.

person satishsingh2230    schedule 25.08.2014