Joda-Time: в чем разница между периодом, интервалом и продолжительностью?

192

В Joda-Time 2, в чем разница между тремя видами промежутков времени:

  • период
  • интервал
  • продолжительность

    1. Зачем нам три класса?

    2. Какой из них работает лучше?

    3. Почему разделение экземпляров Period, Duration или Interval не реализовано? Напримерp = p.divideBy(2);

Gerard
источник
3
Обратите внимание, что эта терминология даты и времени не была стандартизирована (пока). В ISO-8601 идея стандарта о продолжительности является то , что считает Joda-Раз Period. Предложение о стандартизации такой терминологии было выдвинуто, но еще не выполнено.
Василий Бурк

Ответы:

246

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


Интервал в Joda-Time представляет собой интервал времени от одной миллисекунды момента на другой момент. Оба момента являются полностью указанными моментами в континууме даты и времени, с указанием часового пояса. Определено определенное время, например, это может быть интервал между 20:00 до 00:00 вчера и 09:00 по утра сегодня утром.

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

Период в Joda-Time представляет собой период времени , определенный в терминах полей, например, 3 года 5 месяцев 2 дней и 7 часов. Это отличается от продолжительности тем, что оно неточно с точки зрения миллисекунд. Период может быть разрешен только до точного количества миллисекунд, указав момент (включая хронологию и часовой пояс), к которому он относится. Например, рассмотрим период в 1 год, если мы добавим это к 1 января, мы всегда придем к следующему 1 января, но продолжительность будет зависеть от того, является ли промежуточный год високосным или нет. Точно так же, если мы добавим 1 месяц к 1-му числу месяца, мы прибудем 1-го числа следующего месяца, но продолжительность (в миллисекундах) будет варьироваться в зависимости от рассматриваемого месяца.


Для вопроса 3, конкретный метод деления длительности на самом деле не нужен, потому что мы всегда можем получить количество миллисекунд из продолжительности как long(использование getMillis()), разделить его и построить новую продолжительность (использование new Duration(long duration)).

Разделение периода на самом деле не имеет реального значения, основанного на определении периода выше. например, что такое пол месяца? (его длина будет зависеть от того, какой месяц).

MikeJ
источник
1
Я думаю, что разделение периода имеет смысл - полмесяца по-прежнему является действительной единицей времени, но для начала требуется точная дата начала, чтобы точно знать, как долго (точно так же, как месяц является действительным периодом).
Хэдли
11
Jodatime считает период кортежем полей со значениями INTEGER, он не допускает дробных значений. Это соответствует обычному (гражданскому) использованию. Практически никто в обычной жизни не считает, что «1 месяц и 10 дней», разделенные на два, - это «полмесяца и 5 дней». Если вам нужно сделать это разделение, вы, вероятно, хотите перейти к продолжительности (физическое время).
leonbloy
90

Чтобы добавить к ответу mikej :

Joda время продолжительность является «физическим» интервалом времени; например:

12000 milliseconds <- это продолжительность

Joda время интервал фактически пара моментов (начальный момент - конечный момент времени ). Мгновенная , опять же , «физическая» концепция, точка на временной шкале. Например (просто возможная запись):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <- это интервал

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

Рассмотрим эти два интервала:

I1=(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC)

I2=(2010/3/3 21:00:00.000 UTC ; 2010/3/3 22:00:00.000 UTC)

Как интервалы, так I1и I2разные, потому что конечные точки разные; но если я конвертировать их в длительности, я получаю то же самое: 3600000 milliseconds.

(Математическая аналогия: интервалы [10,12]и [95,97]разные интервалы , но они имеют одинаковую длину : «длина интервала» отображается на длительность ).

Наконец, период - это промежуток «гражданского времени», выраженный числом месяцев, дней, часов и т. Д. Он сам по себе не представляет «физический» интервал, поэтому его нельзя напрямую преобразовать в продолжительность (месяцы имеют переменную длину ...).

Это отвечает на вопрос 3: вы можете разделить только на два физического времени (продолжительность).

leonbloy
источник
Четыре месяца, разделенные на два, будут двумя месяцами. Почему это не действует?
Хэдли
1
Как бы вы вычислили 2 месяца; 18 дней делится на 3? Вы не можете получить последовательное определение для такой операции.
leonbloy
3
Я думаю, что вы можете получить последовательное определение, но вы должны думать об этом как о 1/3 времени «2 месяца и 18 дней». Вы не сможете понять, что это такое, пока не преобразуете его в интервал. То, что JODA не поддерживает это, не означает, что оно недействительно.
Хэдли
@hadley Не существует гражданского определения "одна треть дня". Например, контракт не действует в течение трети дня.
ipavlic
4
Дни @Richard Watson могут длиться 23, 24 или 25 часов из-за летнего времени. Следовательно, «треть дня, начиная с ...» действительна, а просто «треть» - нет.
ipavlic