2016-09-25 2 views
4

Что делает python time и datetime модуль возвращается на второй прыжок?Что возвращает python на второй прыжок

Что я получу, когда мы на 23: 59: 60.5 если я позвоню:

  • time.time()
  • datetime.datetime.utcnow()
  • datetime.datetime.now(pytz.utc)

Кроме того, разница между PY2 .7 и py3?


Почему это сбивает с толку (по крайней мере для меня):

Из datetime docs я вижу:

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

На time docs я вижу, есть «поддержка» високосные секунды при разборе с strptime. Но нет комментариев о time.time().

Я вижу, что с помощью time я получаю:

>>> time.mktime(time.strptime('2016-06-30T23:59:59', "%Y-%m-%dT%H:%M:%S")) 
1467327599.0 
>>> time.mktime(time.strptime('2016-06-30T23:59:60', "%Y-%m-%dT%H:%M:%S")) 
1467327600.0 
>>> time.mktime(time.strptime('2016-07-01T00:00:00', "%Y-%m-%dT%H:%M:%S")) 
1467327600.0 

И datetime просто взрывает:

>>> dt.datetime.strptime('2016-06-30T23:59:60', "%Y-%m-%dT%H:%M:%S") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in &lt;module> 
ValueError: second must be in 0..59 

Тогда что я получу в то точное время (в середине второго прыжка) ?

Я читал о временах резины, замедлениях часов, повторяющихся секундах и всех сумасшедших идеях, но что я должен ожидать на python?

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

+0

http://stackoverflow.com/questions/21027639/python-datetime-not-accounting-for-leap-second-properly –

+1

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

+0

@PadraicCunningham: все сообщения datetime о том, как * представить * секунду прыжка с datetime, чего он не может. Речь идет о том, что произойдет, когда вы попытаетесь обработать время * при точном прыжке в секунду *. Который, на текущих компьютерах, означает «ничего», поскольку компьютерные часы не будут отмечать второй прыжок, поскольку нет возможности рассказать своим компьютерным часам раньше времени, чтобы их включить. –

ответ

3

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

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

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

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

+0

Значит ли это, что это просто «не указано», и ваш код должен знать, как NTP будет размещен для вашей машины? (Предполагая, что вы хотите продолжать использовать 'datetime' и не переходить в библиотеку типа' astropy.time', спасибо @MaxNoe) –

+1

@MarioCorchero: нет, я не сказал, что это не указано. Ваши компьютерные часы не знают о прыжках секунд, эта проблема просто игнорируется. Ваши компьютерные часы не совсем точны * в любом случае *, поэтому используется NTP. Ваш компьютер периодически настраивает свои часы по этому протоколу. Единственное, что вам нужно сделать в коде, - это не предполагать, что время всегда идет вперед (поскольку настройки NTP и часовые пояса могут вызывать время для перехода назад). –

+0

@MarioCorchero: для подавляющего большинства программ это совершенно не проблема. Если у вас есть прецедент, который требует * абсолютных временных ограничений *, где временные метки UTC имеют решающее значение, не используйте Python и не полагайтесь на компьютерные часы. Вместо этого создайте себе специализированное временное оборудование. –

Смежные вопросы