Здесь есть два вопроса:
- Ваша JVM имеет устаревшие данные часового пояса
- Вы пытаетесь вычесть один час из 1 часа ночи, когда полночь не существует в эту дату в соответствии с устаревшими данными часового пояса .
В декабре 2017 года правительство Бразилии меняет правила перехода на летнее время, чтобы летнее время начиналось в первое воскресенье ноября. См. эту страницу на португальском языке или эту страницу на английском языке для справок.
Итак, хотя летнее время в 2018 году на самом деле начинается 4 ноября, похоже, ваша JVM считает, что оно начинается 21 октября. Если бы это было так, 12:00 не существовало бы, поэтому 1:00 будет показано как начало этой даты. Вы не сказали нам, какое значение у вас есть в Date
объекте, но я ожидаю, что это будет проблемой.
Во-первых, я бы прекратил использовать java.util.Date
, если возможно. java.time
типы намного лучше, во многих отношениях. Используйте JSR-310 backport , если вы застряли на старой версии Java.
Во-вторых, обновите данные часового пояса. См. эту страницу для получения дополнительной информации.
В-третьих, определите, как вы хотите обрабатывать переходы DST. Это где-то, что мы, вероятно, не можем дать много советов, кроме: а) думать об этом явно; б) написать много тестов. Точные детали того, что вам нужно сделать, будут зависеть от ваших бизнес-правил. (По моему опыту весьма вероятно, что человек, который решает эти бизнес-правила, возможно, еще не задумывался об этом. Не позволяйте им отмахиваться от него: требуйте точных спецификаций. Вежливо, конечно:)