Неожиданный результат вычитания 24 часа с даты 25.03.2008

Я вычитаю 24 часа из Грегорианского Календаря 25.03.2008 09:41.

Результат 03/24/2018 08:41,

public class Utiles{
    public static void main(String args[]) {

        SimpleDateFormat sdt = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        GregorianCalendar gcFinAux = new GregorianCalendar(2018, 2, 25, 9, 41, 0);

        System.out.println("1. " + sdt.format(gcFinAux.getTime()));
        gcFinAux.add(Calendar.HOUR_OF_DAY, -24);
        System.out.println("2. " + sdt.format(gcFinAux.getTime()));
    }
}

Выход:

1. 25/03/2018 09:41:00
2. 24/03/2018 08:41:00

Если я попробую с другой датой, результат будет правильным.

Я пытаюсь в Linux и Windows с JDK1.6.0_45 и Java 1.8.

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

Спасибо.

2 ответа

Я знаю, что в некоторых частях света происходят изменения во время этого конкретного 24-часового периода. Похоже, основная логика принимает это во внимание.

Как было сказано в комментариях, вы наблюдали ожидаемое и правильное поведение в часовых поясах, которые переходят на летнее время (DST) ночью между 24 марта и 25 марта этого года. Это включает в себя большую часть Европы, включая Испанию, а не (европейские части) Турцию и Россию, но также, например, Гренландию и Ливан (в то время как Парагвай переходит с летнего времени в ту же ночь).

java.time: Как сказали в комментариях lexicore и Zabuza, действительно нет причин, по которым вам стоит использовать SimpleDateFormat а также GregorianCalendar, Эти классы давно устарели, а первые особенно печально известны. Вместо этого используйте java.timeсовременный API даты и времени Java:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
    ZonedDateTime zdtFinAux 
            = ZonedDateTime.of(2018, 3, 25, 9, 41, 0, 0, ZoneId.of("Europe/Madrid"));

    System.out.println("1. " + zdtFinAux.format(formatter));
    zdtFinAux = zdtFinAux.minusHours(24);
    System.out.println("2. " + zdtFinAux.format(formatter));

Вывод такой же, как у вас, конечно:

1. 25/03/2018 09:41:00
2. 24/03/2018 08:41:00

Если вы хотели такое же время дня предыдущего дня, используйте один из вариантов: minusDays(1) вместо minusHours(24),

связи

Другие вопросы по тегам