TimeUnit.DAYS.convert(
Math.abs(
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("30-03-2020 00:00:00").getTime() -
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("1-03-2020 00:00:00").getTime()
),
TimeUnit.MILLISECONDS)
Результат 28, а должно быть 29.
Может ли быть часовой пояс / местоположение?
SimpleDateFormat
больше, потому что он устарел.java.time
Вместо этого используйте пакеты от . ВSimpleDateFormat
случае использованияDateTimeFormatter
. В случае Java 7, см. Комментарий Энди Тернера ниже.java.time
[хотя я отмечаю, что вы находитесь на Java 7], ThreeTenBp , Joda).TimeUnit
не делает вид, что ничего не знает о DST. Как говорит Javadoc: наносекунду определяют как одну тысячную микросекунды, микросекунду - одну тысячную миллисекунды, миллисекунду - одну тысячную секунды, минуту - шестьдесят секунд, час - шестьдесят минут, а день - как двадцать четыре часа . --- Так как летнее время приводит к тому, что 2 дня в году не являются ровно 24 часами,TimeUnit
это неправильно, когда речь идет о летнем времени.Ответы:
Проблема в том, что из-за перехода на летнее время (в воскресенье, 8 марта 2020 г.) между этими датами 28 дней и 23 часа .
TimeUnit.DAYS.convert(...)
обрезает результат до 28 дней.Чтобы увидеть проблему (я в восточном часовом поясе США):
Вывод
Чтобы исправить это, используйте часовой пояс без DST, например, UTC :
Вывод
источник
GregorianCalendar
объект и добавлять 1 день за раз, пока не будет достигнута конечная дата. Я бы заплатил высокую цену, чтобы избежать этого. И добавление бэкпорта библиотеки, которая уже является частью Java 8, 9, 10, 11, 12, 13,… не является высокой ценой. Напротив, в следующий раз, когда вам нужно будет что-то сделать с датой или временем, это уже будет выгодно.Причина этой проблемы уже упоминается в ответе Андреаса .
Вопрос в том, что именно вы хотите посчитать. Тот факт, что вы утверждаете, что фактическая разница должна быть 29 вместо 28, и спрашиваете, может ли быть «время в зоне / зоне» быть проблемой » , показывает, что вы на самом деле хотите считать. Видимо, вы хотите избавиться от любой разницы часовых поясов.
Я предполагаю, что вы хотите только рассчитать дни без времени и часового пояса.
Java 8
Ниже, в примере того, как правильно рассчитать количество дней между ними, я использую класс, который представляет именно это - дату без времени и часового пояса -
LocalDate
.Обратите внимание , что
ChronoUnit
,DateTimeFormatter
иLocalDate
требуют , по крайней мере , Java 8, который не доступен для вас, в соответствии с Java-7 тега. Тем не менее, это возможно для будущих читателей.Как упоминал Оле В.В., есть также ThreeTen Backport , который передает функциональность API Java 8 Date and Time на Java 6 и 7.
источник
ThreeTen
;-), но, к сожалению, на момент написания он был отключен.) Я обновлю сообщение.java.time
, потому что в школе они все еще используют старые классы. Но API даты и времени Java 8 очень хорошо спроектирован - было бы неудобно не использовать его.