Ошибка формата даты при использовании Бразильского летнего времени (BRST) - PullRequest
0 голосов
/ 02 мая 2018

У меня возникла проблема при удалении времени из переменной даты (Sun Oct 21 01:00:00 BRST 2018), поскольку оно генерирует ошибку выставления счетов, когда данные поступают из базы данных с этой разницей в 1 час.

Это происходит только в первый день летнего времени в Бразилии

Я уже пробовал использовать класс Calendar.

public static Date zeroTimes( final Date data ) {
        Calendar cal = Calendar.getInstance();
        cal.setTime( data );
        cal.add( Calendar.HOUR, - 1 );
        return cal.getTime();

    }

Возвращение этого метода это Sun Oct 21 01:00:00 BRST 2018, но ожидается, что Sun Oct 21 00:00:00 BRST 2018

Ответы [ 4 ]

0 голосов
/ 02 мая 2018

Здесь есть два вопроса:

  • Ваша JVM имеет устаревшие данные часового пояса
  • Вы пытаетесь вычесть один час из 1 часа ночи, когда полночь не существует в эту дату в соответствии с устаревшими данными часового пояса .

В декабре 2017 года правительство Бразилии меняет правила перехода на летнее время, чтобы летнее время начиналось в первое воскресенье ноября. См. эту страницу на португальском языке или эту страницу на английском языке для справок.

Итак, хотя летнее время в 2018 году на самом деле начинается 4 ноября, похоже, ваша JVM считает, что оно начинается 21 октября. Если бы это было так, 12:00 не существовало бы, поэтому 1:00 будет показано как начало этой даты. Вы не сказали нам, какое значение у вас есть в Date объекте, но я ожидаю, что это будет проблемой.

Во-первых, я бы прекратил использовать java.util.Date, если возможно. java.time типы намного лучше, во многих отношениях. Используйте JSR-310 backport , если вы застряли на старой версии Java.

Во-вторых, обновите данные часового пояса. См. эту страницу для получения дополнительной информации.

В-третьих, определите, как вы хотите обрабатывать переходы DST. Это где-то, что мы, вероятно, не можем дать много советов, кроме: а) думать об этом явно; б) написать много тестов. Точные детали того, что вам нужно сделать, будут зависеть от ваших бизнес-правил. (По моему опыту весьма вероятно, что человек, который решает эти бизнес-правила, возможно, еще не задумывался об этом. Не позволяйте им отмахиваться от него: требуйте точных спецификаций. Вежливо, конечно:)

0 голосов
/ 02 мая 2018

В тот день, когда летнее время (horário de verão) начинается в Бразилии, часы переводятся на 1 час вперед с 00:00 до 01:00. Это означает, что нет времени 00:00, оно не существует. Так что извините, у вас этого не может быть.

0 голосов
/ 02 мая 2018
  1. Во-первых: правильна ли ваша дата для изменения BRST? Интернет утверждает, что это 4 ноября 2018 .

  2. Secondary: продолжительность дня, когда вы переходите на летнее время длится всего 23ч , поэтому, возможно, для целей выставления счетов вам придется пересмотреть способ расчета выставления счетов, если он производится ежечасно.

0 голосов
/ 02 мая 2018

Вместо того, чтобы пытаться вычесть часы, было бы проще установить прямую полночь?

Calendar cal = Calendar.getInstance();
cal.setTime(data);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

return(new Date(cal.getTime().getTime()));
...