Неожиданный результат вычитания 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)
,
связи
- Часы меняются в Мадриде, Испания (для неевропейских читателей).
- Учебник Oracle: Дата и время, объясняющие, как использовать
java.time
,