День всегда длится 86 400 эпох? - PullRequest
       13

День всегда длится 86 400 эпох?

38 голосов
/ 26 сентября 2011

Просматривая мои прошлые ответы, я заметил, что предложил код, такой как 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 секунд»перерыв предположения, для эпохальных определений «второго», если вообще?(Я предполагаю, что такие функции, как time.mktime в Python, уже возвращают значения, откорректированные по DST, поэтому приведенный выше фрагмент также должен работать в дни переключения DST ... Надеюсь?)

Ответы [ 4 ]

21 голосов
/ 08 июля 2013

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

Например, если сейчас «10:00:00 AM», то количество секунд до«Завтра в 10:00:00 утра» может означать несколько разных вещей, в зависимости от того, какие часовые пояса вы используете, начинается ли DST или заканчивается сегодня вечером, и т. Д.появляется в вашем коде, есть большая вероятность, что вы делаете что-то, что не совсем правильно.

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

11 голосов
/ 26 сентября 2011

Согласно Википедии ,

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

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

Снова отредактируйте: вторая догадалась из-за запутанной документации по питону.time.mktime всегда возвращает время эпохи UTC.Красный.:)

9 голосов
/ 02 декабря 2013

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

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

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

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

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

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

6 голосов
/ 20 ноября 2013

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

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

...