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

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

  • Period
  • Interval
  • Duration

    • Зачем нам нужны три класса?

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

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

Ответ 1

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


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

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

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


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

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

Ответ 2

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

A Joda-Time продолжительность - это "физический" интервал времени; например:

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

Время Joda-Time на самом деле представляет собой пару мгновений (начало мгновенного момента). мгновенный - это опять-таки "физическая" концепция, точка на временной шкале. Например (только возможные обозначения):

(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: вы можете разделить только на два физическое время (продолжительность).