Вероятно, это происходит из-за какого-то округления в сочетании с разницей в часовых поясах.
Поскольку оба операнда слева и справа от вашего оператора /
являются целочисленными типами, с этим вы теряете точностьоператор.
Если вы измените свое выражение на: (double) difference / (1000 * 60 * 60 * 24)
, вы заметите, что на самом деле результат: -278.9583333333333
Причина, по которой это не точные дни, связана с переходом на летнее и т. д.корректировки даты / времени.
Если на вашем ПК установлены разные региональные настройки с сервера, на которых нет одинакового перехода на летнее время, возможно, вы получили другое число, которое превысило 279
.
Как примечание, Java 7 и более ранние API даты / времени были очень глючными.SimpleDateFormat
не был даже потокобезопасным, и было много проблем с переходом на летнее время и в подобных ситуациях.Вы должны действительно перейти на Java 8. То, что вы делаете, просто станет: Duration.between(startDate, endDate)
, и вычисление будет выполнено для вас правильно.
String sDate = "10-11-2017";
String eDate = "16-08-2018";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDateTime startDate = LocalDate.parse(sDate, formatter).atTime(0, 0);
LocalDateTime endDate = LocalDate.parse(eDate, formatter).atTime(0, 0);
return Duration.between(startDate, endDate).toDays();
Вы увидите, что это действительно дает вам 279
.