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


192

У Joda-Time 2, яка різниця між трьома видами часових проміжків:

  • Період
  • Інтервал
  • Тривалість

    1. Для чого нам потрібні три класи?

    2. Хто з них краще?

    3. Чому поділ періоду чи екземпляра тривалості чи інтервалу не реалізовано? Напрp = p.divideBy(2);


3
Зауважте, що ця термінологія для дат не була стандартизована (поки що). Ідея стандарту ISO-8601 про тривалість - це те, що вважає Joda-Time Period. Пропозиція щодо стандартизації такої термінології була піднята, але ще не виконана.
Василь Бурк

Відповіді:


246

3 класи потрібні, оскільки вони представляють різні поняття, тож це питання вибору відповідного для роботи, а не відносної ефективності. З документації із коментарями, доданими мною курсивом :


Інтервал в Joda-Time є інтервал часу від однієї мілісекунди моменту на інший момент. Обидва екземпляри є повністю визначеними екземплярами у континуумі дати, у комплекті з часовим поясом.Визначено конкретний час, наприклад, це може бути інтервал між 20: 00: 00GMT вчора та 09: 00: 00GMT сьогодні вранці.

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

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


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

Поділ періоду насправді не має реального значення, заснованого на визначенні періоду вище. наприклад, що таке півмісяця? (його тривалість залежатиме від того, який місяць).


1
Я думаю, що поділ періоду має сенс - півмісяця все ще є дійсною одиницею часу, але для того, щоб точно знати, як довго (точно такий же спосіб, місяць є дійсним періодом), потрібна дата початку.
Хадлі

11
Jodatime вважає період посиланням на цільові поля INTEGER, але це не дозволяє дробові значення. Це відповідає загальному (цивільному) використанню. Практично ніхто в звичайному житті не вважає, що "1 місяць і 10 днів" розділені на два - це "півмісяця і 5 днів". Якщо вам потрібно зробити цей поділ, ви, ймовірно, хочете перейти до тривалості (фізичного часу).
leonbloy

90

Щоб додати відповідь mikej :

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

12000 milliseconds <- це тривалість

Інтервал Joda-Time - це фактично пара моментів (start instant - end instant). миттєвим , знову ж , «фізична» концепція, точка на часовій шкалі. Наприклад (лише можливі позначення):

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


Чотири місяці, розділені на два, мали б два місяці. Чому це не дійсно?
Хадлі

1
Як би ви обчислили «2 місяці; 18 днів 'ділиться на 3? Ви не можете отримати послідовне визначення такого роду операцій.
leonbloy

3
Я думаю, ви можете отримати послідовне визначення, але ви повинні думати про це як 1/3 часу "2 місяці і 18 днів". Ви не зможете вирішити, що саме є, доки не перетворите його на інтервал. Тільки тому, що JODA не підтримує, це не означає, що він недійсний.
Хадлі

@hadley Не існує цивільного визначення "третина дня". Наприклад, жоден контракт не діє протягом третини дня.
ipavlic

4
@ Richard Watson Дні може тривати 23, 24 або 25 годин через DST. Тому "третина дня, починаючи з ..." є дійсною, але просто "третина" - ні.
ipavlic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.