2014-10-07 3 views
7

На протяжении многих лет я сталкивался с различными интерпретациями в конце дня. Но что такое правильный способ от его отображения при сравнении дат и интервалов?Какова правильная интерпретация в конце дня?

Я обнаружил, что некоторые люди предпочитают 23:59:59, а другие используют 00:00:00.
Здесь, на StackOverflow, я даже нашел несколько вопросов, связанных с использованием и отображением 24:00:00, однако сфера охвата этого вопроса более сфокусирована на определении того, как разделить два дня.

Другими словами, нас интересует проблема определения, где заканчивается ровно день, и где начинается следующее. Это, по-видимому, общая проблема во многих приложениях, требующих даже самых простых сравнений или вычислений временных интервалов.

Чтобы уточнить вышеуказанные интерпретации, ниже приведены три примера, представляющие 1 января й 2014 в рамках трех различных интерпретаций:

  1. Квази полночь: 2014-01-01 00:00:00 - 2014-01-01 23:59:59
  2. Полночь острые: 2014-01-01 00:00:00 - 2014-01-02 00:00:00
  3. Военная полуночи: 2014-01-01 00:00:00 - 2014-01-01 24:00:00

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

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

Наконец, полуночная резкая интерпретация представляется хорошим кандидатом на наиболее последовательную. В отличие от полуночи квази, не требуется шаблон для установки времени, и он, естественно, ведет себя с операторами <, <=, > и >=.

Стоит отметить, что язык PHP уже интерпретирует 2014-01-01 24:00:00, как 2014-01-02 00:00:00, который имеет эффект преобразования даты полуночных резкий интерпретации.

Есть ли замечательные прецеденты в образцовых библиотеках или стандартах FLOSS, которые бы оправдывали использование одной интерпретации над другой?

+1

Какое определение «правильно» в этом контексте? – Ideasthete

+1

Каково ваше фактическое приложение? Не будет ли это иметь отношение к интерпретации? –

+0

Я верю, что в контексте вопроса подразумевается, что интерпретация по своей сути работает с операторами, она не требует кода шаблона или установки и что он не оставляет места для неопределенности. См. Ответ @ JonathonReinhart для объяснения неопределенного времени или пробелов. –

ответ

6

Сначала давайте вспомним open and closed intervals из математики:

  • открытый интервал не включает его конечные точки и обозначается круглыми скобками. Например, (0,1) означает больше 0 и меньше 1.
  • Закрытый интервал включает в себя его конечные точки и обозначается квадратными скобками. Например [0,1] означает больше или равно 0 и меньше или равно 1.

Я не думаю, что кто-то не согласен, что день начинается во время 00:00:00.000000.... Это означает, что любая секунда, миллисекунда, микросекунда и т. Д. до до этого момента приходится на предыдущий день.

Мы выражаем эту концепцию с помощью с левым и правым открытым окном. Итак:

На следующий день 1 января 2014 охватывает то время ["2014-01-01 00:00:00", "2014-01-02 00:00:00")

Это будет означать полночь резкое правильно.Однако для этого потребуется, чтобы ваша машина имела бесконечное разрешение, чтобы представить все эти действительно, действительно небольшие единицы времени непосредственно перед 00:00:00 на следующий день.

Поскольку ни цифровая система не может иметь бесконечное разрешение, мы вынуждены признать, к квази полуночи, который был бы отрезком. Точное значение правой конечной точки зависит от разрешения вашей системы.

Как MikeW выразился:

На следующий день 1 января 2014 охватывающего время
["2014-01-01 00:00:00", "2014-01-02 00:00:00"-system_resolution]

Если окружающая среда/языке/структуры данных обеспечивают только один-вторую резолюцию, то последний момент дня на 23:59:59. Для разрешения в миллисекундах это будет 23:59:59.999.

Таким образом, в сущности, как квази полночь и полночь резкого правильно, но ваша конечная точка для квази полуночи зависит от разрешения.


На практике я не думаю, что вам нужно беспокоиться об этом! Просто используйте DateTime -как объектов/API, ваш язык обеспечивает и соответствующие условные операторы (псевдо-код):

if DateTime.Now() < DateTime("2000-01-01 00:00:00"): 
    // Worry about Y2K bugs 
+0

Нет причин, по которым вы не можете измерить последнюю секунду, например, 23: 59: 59.999 (последняя миллисекунда). Проблема с __midnight sharp__ заключается в том, что у вас есть двусмысленность. –

+1

@ user2864740 Почему это было бы неправильно? '<2014-01-02 00: 00: 00' будет до 2 января. – jbx

+0

В этом случае вы не используете __midnight sharp__, вы используете __quasi midnight__. –

2

Ну, «Каков правильный способ его представления?» это субъективный вопрос, поэтому ответить невозможно.Тем не менее, большинство «часовых» приложений и системных часов представляют его как «Quasi Midnight» выше, поэтому вы, вероятно, должны пойти с этим, если хотите согласованность представления времени пользователям.

Но если вы не показываете время непосредственно пользователям и вместо этого используете его как часть некоторых других вычислений, это скорее всего зависит от приложения.

This page и this page предоставляют довольно много примеров того, насколько проблематичным является время и насколько субъективная «правильность» может получить в зависимости от вашего приложения.

6

00:00:00 - начало нового дня.

23:59:59 - последняя секунда старого дня, но все еще есть секунда, поэтому 23:59:59.999 является последней миллисекундой старого дня. Его все еще не конец дня, хотя еще есть 1 миллисекунда.

Это зависит от того, что вам нужно сделать. Если вы хотите проверить, произошло ли событие до полуночи резкое (например, вы запрашиваете базу данных MySQL), оператор < в начале нового дня будет делать, потому что он удовлетворяет любой степени детализации (наносекунды, микросекунды, что угодно) ,

Если вы хотите проверить, если что-то случилось в новый день, он должен быть >= начало нового дня, т.е. 00:00:00

+0

В какой часовой зоне? Простой тип времени недостаточен для решения этой проблемы. Есть такие отрасли, как путешествия, транспорт, где такие вопросы очень важны, и нет места для предположений и двусмысленностей. –

+0

Вы правы, но проблема здесь не связана с временной зоной. Вопрос OP - это точная граница, которая ограничивает один день от другого, без каких-либо упоминаний о различиях в часовом поясе. Если вы относитесь к разным часовым поясам для путешествий и т. Д., То вам также необходимо принять это во внимание. В зависимости от вашей проблемы вы можете либо нормализовать до одного часового пояса, например, UTC, либо настроить часовой пояс пользователя, если вы это знаете. Это зависит от вашей проблемы. – jbx

2

IMO, она в основном сводится к * какие требования вы на самом деле для проблема под рукой и * временное разрешение в инструментах/языках в вашем распоряжении.

В конце концов, очень легко переоценить любую проблему в абстрактных терминах.

Сказав это, я лично предпочитаю строгий менее чем (<) 00:00:00

+0

Я полностью согласен с вами. Кажется «неправильным» создать какой-либо разрывы в противном случае непрерывный промежуток времени, будь то какой-то один момент в минуту. –

+0

Но в какой-то момент вы не можете представлять время постоянно. Даже если вы выбираете в микросекундах, вы игнорируете пространство между микросекундами. Время непрерывное, вычисление дискретно. – Ideasthete

1

Тип данных даты и времени традиционно представлены в виде числа с плавающей точкой. Весь номер числа - это число дней с заданной эпохи, а мантисса или десятичная часть составляют временное смещение. Существует много разных эпох и множество способов хранения даты. В основном я наблюдал начало дня как 01/01/2001 12:00:00 AM и конец дня, рассматриваемый как 01/01/2001 11:59:59 PM.

Хороший способ подумать об этом будет то, что вычитание одной секунды с полуночи будет 11:59:59 предыдущего дня, а затем добавление второй назад снова будет полночь.

Значение в полночь определенного дня будет храниться таким же образом, используя указанную выше эпоху. 12-часовая 24-часовая семантика Zulu - это только что выбранные параметры отображения значения Date Time.