2013-12-14 1 views
11

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

PnYnMnDTnHnMnS 

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

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

+0

какой язык программирования вы используете? –

+2

@ JánVorčák, язык программирования здесь не вопрос. В стандарте не указано, как представлять 40 мегасекунд в формате продолжительности 'n' years,' n' месяцев, 'n' дней и т. Д. Как узнать, сколько дней« M1D2 »? Это 31 + 2? или 30 + 2? или, возможно, 28 + 2? Кажется, вот что задает вопрос. – soulseekah

+1

@soulseekah вы правы Извините, я неправильно понял вопрос –

ответ

9

Хорошо, давайте навести порядок:

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

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

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

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

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

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

+2

Интересно. Все ли реализации поддерживают это как стандарт? Будут ли все реализации корректно анализировать 'PT40000000S'? – soulseekah

+2

Я не знаю всех реализаций стандарта, и вполне возможно, что люди предпочтут принять только часть стандарта для удовлетворения своих потребностей - отложив это в сторону, если заявка на внедрение для поддержки ISO-8601 должна быть способна проанализировать PT40000000S или любые другие варианты, описанные в стандарте, в противном случае он не полностью поддерживает стандарт. –

+1

Как насчет секунд прыжка? – Mike

2

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

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

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

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

Существуют ли какие-либо принятые средства с использованием периода без даты начала?

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

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

Edit:

An (несовершенной) аналогия:

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

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

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

Ответ: is не имеет смысла делать это без дополнительного контекста.

+1

Время Unix имеет подразумеваемую дату начала. Оп спрашивает, как обойти необходимость иметь его. – oakad

+1

@oakad Я знаю; прочитайте второй вопрос. Я говорю, что нет никакого способа обойти требование без использования оценок или средних значений. Время Unix - так как единица всего несколько секунд - может использоваться для однозначного представления временного интервала без даты начала. Нет необходимости конвертировать месячную длину или любую другую единицу времени. Неважно, какая подразумеваемая дата начала. ОП четко не задал вопрос «как это сделать, используя только ISO-8601», но ответ заключается в том, что он не может. – klugerama

1

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

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