2009-03-13 4 views
6

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

Этот вид расчетов, по-видимому, очень распространен, и мне было бы приятно обсудить различные подходы к вопросу.

+0

JODA TIME !!!!!! (В до спешки!) –

+0

[java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) !!!!!! –

ответ

11

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

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

+0

FYI, проект [Joda-Time] (http://www.joda.org/joda-time/) теперь находится в [режиме обслуживания] (https://en.wikipedia.org/wiki/Maintenance_mode), с команда, предлагающая перейти на классы [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). См. [Учебное пособие по Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

1

Here is an article обсуждение использования объектов Date/Calendar в java для расчета прошедшего времени.

3

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

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

2

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

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

int daysDifference = Days.daysBetween(startInstant, endInstant).getDays(); 
+0

И для преобразования существующих объектов 'java.util.Date' в' ReadableIntervals', которые вы можете передать в 'daysBetween', вы можете сделать:' new DateTime (somejavautildate) ' –

+0

FYI, [Joda-Time] (http: //www.joda.org/joda-time/) теперь находится в [режиме обслуживания] (https://en.wikipedia.org/wiki/Maintenance_mode), а команда советует перейти на [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). См. [Учебное пособие по Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

1

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

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

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

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

В перечислении ChronoUnit перечислены полезные методы, такие как between.

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

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

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

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

Где получить классы java.time?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

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