Простые вычисления даты в Java

Я хотел бы сделать простые вычисления даты на Java. Например, вычислите разницу в днях между датами (с нулевым компонентом времени). Конечно, вы можете сделать простое вычитание из миллисекунд, разделенных на количество миллисекунд в день, что отлично работает - до тех пор, пока на сцену не войдет летнее время. Я осознаю, что возможны разные интерпретации «разницы в днях», в частности, независимо от того, следует ли учитывать временную составляющую или нет. Предположим, что у нас есть компонент времени 0 для простоты.

Такой вид вычислений кажется очень распространенной потребностью, и мне было бы неплохо обсудить различные подходы к этому вопросу.


person mikemax    schedule 13.03.2009    source источник
comment
ВРЕМЯ ДЖОДА !!!!!! (До спешки!)   -  person Michael Myers    schedule 13.03.2009
comment
java.time !!! !!!   -  person Basil Bourque    schedule 28.04.2017


Ответы (5)


Я бы посмотрел на библиотеку даты и времени Joda и, в частности, на ReadableInterval класс.

Joda значительно упрощает жизнь при манипулировании датами и временем в Java, и я считаю, что это основа новой Java JSR 310 относительно. даты / время. то есть он (или что-то очень похожее) будет присутствовать в будущей версии Java.

person Brian Agnew    schedule 13.03.2009
comment
К вашему сведению, проект Joda-Time теперь находится в режим обслуживания, при этом команда советует перейти на классы java.time. См. Руководство Oracle. - person Basil Bourque; 28.04.2017

Похоже, Date, Calendar и DateUtils сделают все, что вы ищете. http://commons.apache.org/lang/api/org/apache/commons/lang/time/DateUtils.html.

DateUtils позволяет обрезать или округлять время, поэтому вы можете работать только с датами. Вы также упомянули о переходе на летнее время. Основная проблема заключается в том, что кто-то говорит, что сделал что-то в 01:30 того дня, когда было изменение летнего времени ... в какое это было 01:30? Первый или второй? К счастью, с этим можно справиться с помощью класса Calendar, поскольку он хранит часовой пояс и смещение летнего времени. Чтобы узнать подробности обо всем этом, ознакомьтесь с этим: http://www.xmission.com/~goodhill/dates/deltaDates.html

person user77978    schedule 14.03.2009

Более простой вариант - использовать классы дней, недель, месяцев и годов в Joda.

Таким образом, вы можете сделать что-то очень простое, например:

int daysDifference = Days.daysBetween(startInstant, endInstant).getDays();
person Sarhanis    schedule 19.04.2011
comment
А чтобы преобразовать существующие java.util.Date объекты в ReadableIntervals, которые можно передать в daysBetween, вы можете: new DateTime(somejavautildate) - person DK_; 02.04.2014
comment
К вашему сведению, проект Joda-Time теперь находится в режим обслуживания, при этом команда советует перейти на классы java.time. См. Руководство Oracle. - person Basil Bourque; 28.04.2017

Использование java.time

Современный подход основан на использовании классов java.time, которые вытесняют утомительные старые устаревшие классы даты и времени.

вычислить разницу в днях между датами (с нулевым компонентом времени)

Класс LocalDate представляет только дату значение без учета времени суток и часового пояса.

Перечисление ChronoUnit имеет некоторые удобные такие методы, как _ 3_.

При определении промежутков времени классы java.time используют подход Half-Open, где начало включающее, а окончание исключающее.

LocalDate start = LocalDate.of( 2017 , Month.JANUARY , 23 );
LocalDate stop = LocalDate.of( 2017 , Month.FEBRUARY , 17 );
long daysBetween = ChronoUnit.DAYS.between( start , stop );

Вы можете представить этот промежуток времени как объект, используя Period класс.

Period p = Period.between( start , stop );

О java.time

Фреймворк java.time является встроен в Java 8 и новее. Эти классы заменяют неудобные старые устаревшие классы даты и времени, такие как _ 7_, _ 8_, & _ 9_.

Проект Joda-Time теперь в режим обслуживания, советует перейти на java.time классы.

Чтобы узнать больше, см. Учебник Oracle. И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310.

Где взять классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. . Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, например _10 _, YearWeek, _ 12_ и подробнее.

person Basil Bourque    schedule 28.04.2017

Вот статья обсуждение использования средств даты / календаря в Java для расчета прошедшего времени.

person James Van Huis    schedule 13.03.2009