Простые вычисления даты Java - PullRequest
6 голосов
/ 13 марта 2009

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

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

Ответы [ 5 ]

11 голосов
/ 13 марта 2009

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

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

3 голосов
/ 14 марта 2009

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

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

2 голосов
/ 19 апреля 2011

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

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

int daysDifference = Days.daysBetween(startInstant, endInstant).getDays();
1 голос
/ 28 апреля 2017

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

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

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

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

Перечисление ChronoUnit имеет несколько удобных методов, таких как between.

При определении промежутков времени классы 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 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

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

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

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

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

1 голос
/ 13 марта 2009

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

...