Каково значение продолжительности ISO 8601 `P1M` (в секундах)?
Предположим, у меня есть продолжительность ISO 8601, выраженная как "P1M"
, В разговорной речи это означает "один месяц". Существует ли стандартное правило для преобразования этого числа в несколько секунд, если исходная дата неизвестна?
- В течение 30-дневных месяцев это может быть 2 592 000 человек.
- Для 31-дневного месяца это может быть 2 678 400 человек.
- В феврале это может быть 2 419 200 или 2 505 600.
Моя интуиция говорит, что нет способа разрешить "один месяц" до точного количества секунд, не зная контекста, и где эти секунды указаны в календаре. Но существуют ли стандартные правила / условные обозначения для расчета этих длительностей абстрактным способом?
1 ответ
Из документации ISO 8601, которую я нашел (стр. 6 - http://xml.coverpages.org/ISO-FDIS-8601.pdf), кажется, что вы правы в том, что количество секунд в месяце не может быть определено окончательно. Тем не менее, он отмечает, что "В некоторых приложениях месяц рассматривается как единица времени в 30 дней", поэтому в зависимости от вашего приложения это может быть правильным подходом.
Различие между "Календарным временем" (годы, месяцы и т. Д.) И "Абсолютным временем" (часы, минуты, секунды и т. Д.) Иногда является важным. Например, некоторые люди могут жаловаться на 13 выплат по ипотечным кредитам за несколько лет, если они платят каждые 30 дней, а не каждый месяц.
Вы правы, продолжительность ISO 8601 зависит от контекста. Продолжительность - это период / интервал времени между двумя датами.
Пример:
2020-01-01/2020-02-01 = P1M = P31D
2020-02-01/2020-03-01 = P1M = P29D
2019-02-01/2019-03-01 = P1M = P28D
Если вы хотите, чтобы фиксированная продолжительность не зависела от контекста, используйте обозначение дня P30D, P60D, P90D...
вместо.
То же самое относится и к годам:
2019-01-01/2020-01-01 = P1Y = P12M = P365D
2020-01-01/2021-01-01 = P1Y = P12M = P366D
Если у вас нет контекстной информации о продолжительности, например P1M
полученный из базы данных или введенный пользователем, использовать по умолчанию текущий контекст.
//What is a duration of one month in seconds ?
P1M = ? (no context)
//Use default context
Today = 2020-03-31
2020-03-31/P1M = 2020-03-31/2020-04-31
=> P1M = P30D
//A month contains 2 592 000 seconds