Является ли день всегда 86 400 секунд в секунду?

При рассмотрении моих прошлых ответов я заметил, что предложил код, например this:

import time

def dates_between(start, end):
  # muck around between the 9k+ time representation systems in Python
  # now start and end are seconds since epoch

  # return [start, start + 86400, start + 86400*2, ...]
  return range(start, end + 1, 86400)

Перечитывая этот фрагмент кода, я не мог не почувствовать ужасное прикосновение Тони Пони на моем позвоночнике, мягко бормоча "прыгать секунд" на мои уши и другие такие ужасные, ужасные вещи.

Когда длительность "дня составляет 86 400 секунд", для определения эпохи "второй", если вообще когда-либо? (Я предполагаю, что такие функции, как Python time.mktime, уже возвращают значения, скорректированные с помощью DST, поэтому приведенный выше фрагмент также должен работать в дни переключения DST.. Надеюсь?)

Ответ 1

При выполнении календарных вычислений почти всегда лучше использовать любой API, который предоставляет платформа, например, Python calendar, или зрелой высококачественной библиотеки, чем писать "более простой" код самостоятельно. API-интерфейсы календаря являются уродливыми и сложными, но это потому, что календари реального мира имеют много странного поведения.

Например, если это "10:00:00 AM" прямо сейчас, то количество секунд до "10:00:00 AM завтра" может быть несколько разных вещей, в зависимости от того, какой часовой пояс вы используют ли DST начало или конец сегодня и т.д.

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

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

Ответ 2

Согласно Wikipedia,

Дни UTC почти всегда имеют длину 86 400 с, но из-за "прыжковых секунд" иногда составляют 86 401 с и могут составлять 86 399 с (хотя последний вариант никогда не использовался по состоянию на декабрь 2010 года); это дней, синхронизированных с вращением Земли (или Универсального времени).

Я ожидаю, что двойной прыжок второй может на самом деле сделать день 86402s длинным, если бы это когда-либо использовалось.

РЕДАКТИРОВАТЬ еще раз: второй догадывался сам из-за путаницы документации python. time.mktime всегда возвращает секунды времени UTC. Красный.:)

Ответ 3

Количество секунд в день зависит от используемой системы времени, например, в POSIX, день составляет ровно 86400 секунд по определению:

Как показано в секундах со времен Эпохи, каждый день составляет ровно 86400 секунд.

В UTC может быть включен второй прыжок, т.е. день может быть 86401 секунд SI (и теоретически 86399 секунд SI). По состоянию на 30 июня 2015 года это произошло 26 раз.

Если мы измеряем дни кажущимся движением Солнца, то длина (солнечного) дня меняется в течение года на ~ 16 минут от среднего.

В свою очередь, он отличается от UT1, который также основан на вращении Земли (среднее солнечное время). Очевидный солнечный день может быть на 20 секунд короче или на 30 секунд дольше, чем средний солнечный день. UTC сохраняется в течение 0,9 секунд после UT1 путем введения случайных интеркалярных секунд прыжка.

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

Ответ 4

Во всех часовых поясах, которые "поддерживают" летнее время, вы получите два дня в году, которые не имеют 24 часа. У них будет 25 или 23 часа соответственно. И даже не думайте о жестком кодировании этих дат. Они меняются каждый год и между часовыми поясами.

О, и вот список 34 других причин, о которых вы не думали, и почему вы не должны делать то, что делаете.