Представление 40 000 000 секунд в качестве периода ISO-8601

40 000 000 секунд - 462,962 дня. Если бы я хотел представить это как период ISO-8601, в этой форме:

PnYnMnDTnHnMnS

Каковы правила определения месяцев и лет? Также нет точных терминов, и стандарт говорит, что это зависит от даты начала периода.

Это имеет смысл: он делает период неоднозначным без даты начала. Есть ли приемлемые способы использования периода без даты начала?

Ответ 1

Хорошо, допустим порядок:

Стандартная поддержка обоих типов:   Даты как конкретный момент времени с 0000 года и до 9999 года.
Или   Длительность, которая может описывать промежуток времени между двумя датами или продолжительность/продолжительность арбитра, не связанная с двумя конкретными датами. К счастью, когда вы указываете длительности, стандарт намного более гибкий, чем с датами:)

Итак, как мы можем определить разницу между продолжительностью, которая относится к датам и длительности арбитра?
Простой: если вы указали "P1Y", который составляет один год - это именно то, что вы получили.
Если вы хотите рассчитать, сколько это 1 год имеет в днях - это будет зависеть от даты начала подачи этого года.
В примере, если, например, дата начала - 1/1/2010 (значит, в феврале есть 28 дней, что нормально), ваш расчет за 1 год при расчетах даст 365 дней. Но если говорить, что дата начала составляет 1/1/2012 (поэтому февраль имеет 29 дней из-за високосного года), ваше значение за 1 год даст 366 дней в нем...

Но в обоих случаях вам нужен 1 год - и у вас есть 1 год. Поэтому 1-е дело не в том, чтобы использовать годы в длительности в вашем случае, так как то, что вы действительно хотите, это указать эквивалент 40000000 в секундах - просто в ближайшее время... так что наша следующая альтернатива - указать его в днях и 0,962 как часть дня:

40000000 секунд - 462 дня, 23 часа, 6 минут и 40 секунд, и согласно тому, что я читал в ISO-8601, это можно указать как продолжительность: "P462DT23H6M40S" или вы можете просто указать "PT40000000S" или даже "P462.962D" - все будет длиться.

Чтобы облегчить боль при вычислении, вы можете использовать эту очень простую линию С#:
var timespan = new TimeSpan(0, 0, 40000000);
Просто поставьте точку останова после него и посмотрите на внутренности класса Timespan, рассчитанного для вас.
Поставить их в формат ISO-8601 довольно легко после этого.

О, и последнее - да, вы также можете указать фракции - например, "P0.5Y", чтобы указать полгода.

Ответ 2

Когда я прочитал (свободно доступную документацию) для стандарта, ответ на первый вопрос

Каковы правила определения месяцев и лет?

... заключается в том, что нет правил, потому что (как вы отметили) это невозможно без начальной даты/времени или продолжительности. Поэтому необходим контекст.

Что касается вашего второго вопроса,

Есть ли приемлемые способы использования периода без даты начала?

Абсолютно: см. Unix Time. В Unix-время 40 000 000 секунд будут представлены как 40000000.

Довольно простое преобразование, мне даже не нужно использовать калькулятор!;)

Edit:

Аналоговая (несовершенная):

Используя только метрическую систему, насколько далеко она доходит до Чикаго из Лондона? Что определяет метрическая система как лучший/самый точный метод для представления этого расстояния?

Ну, метрическая система определяет единицы длины/расстояния, которые мы можем использовать: метры.

Проблема заключается в том, что метрическая система просто не учитывает задействованные переменные. Учитываем ли мы кривизну Земли? Является ли это геометрически прямой линией, является ли это "как вороньи мухи", является ли это расстоянием, определяемым доступными общественными маршрутами и известными траекториями полета?

Ответ заключается в том, что нет никакого способа сделать это без дополнительного контекста.

Ответ 3

Как упоминалось в другом ответе Г.Я., не все годы равны числу дней. То же самое верно, если вы конвертируете в дни - не все дни - 24 часа. Место это чаще всего происходит в периоды, которые пересекают границы времени на летнее время, что делает период времени выключенным на час (конечно, если он пересекает четное количество границ, ошибки отменяются).

Второе место это может произойти, когда период пересекает границу конца месяца, потому что вы можете получить или потерять секунду прыжка. Опять же, это редко встречается в большинстве бизнес-приложений и обычно игнорируется, но это может быть проблемой, если вы координируете несколько систем, синхронизированных с мировыми часами.