Python дата-время эпохи - PullRequest
0 голосов
/ 15 мая 2018
t='20180515102500'
d=datetime.strptime(t, "%Y%m%d%H%M%S")
millis_since_epoch = int(time.mktime(d.timetuple())) * 1000
print(millis_since_epoch)

дает мне: 15263 799 00000 на repl.it (python 3.6.1) и на моем локальном: 15263 979 00000 (python 2.7.14)

Почему?Каков рекомендуемый способ преобразования даты и времени в эпоху?

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Ваша проблема в том, что вы используете наивные datetimestruct_tm и т. Д.) Объекты.Таким образом, вы спрашиваете, как далеко от эпохи Unix 15 мая 2018 10:25:00 в «какой бы ни был местный часовой пояс на этой машине».Если вы запустите его на двух машинах с часовыми поясами с интервалом в 5 часов, вы получите результаты, которые находятся на расстоянии 5 *3600* 1000 миллисекунд.

Рекомендуемый способ сделать это:

d.timestamp() # returns difference from epoch as float seconds

… Или:

d - datetime.fromtimestamp(0) # returns difference as timedelta

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

Но ни один из них не будет иметь здесь никакого значения, так как вы все еще используете наивные объекты даты и времени.(По крайней мере, вы не смешиваете другие типы из модуля time и отбрасываете точность, но вы не решаете свою проблему.)


Решение вашей проблемы зависит от того, что выПытаешься сделать.Это метки времени UTC?Являются ли они временными метками в некотором известном часовом поясе, который вы знаете вне диапазона?

Если все в формате UTC, лучше всего явно создать объекты UTC, но самое простое (особенно если вам нужно)Ваш код для запуска в 2.7):

d - datetime.utcfromtimestamp(0)

Это дает вам наивное время даты, представляющее 0 UTC секунд с начала эпохи, и вычитает его из вашего наивного значения даты и времени, представляющего X UTC секунд с начала эпохи, так что вы получитеtimedelta, представляющее X секунд (в частности, 17666 дней, 37500 секунд), независимо от того, какой часовой пояс используется системой.

Или самое маленькое изменение в существующем коде - использовать utctimetuple вместоtimetuple, который делает то же самое более запутанным образом.

0 голосов
/ 15 мая 2018

в Python 3.6:

datetime.timestamp()

например:

import datetime

timestamp = datetime.datetime.now().timestamp()
0 голосов
/ 15 мая 2018

Попробуйте это:

t='20180515102500'
d=datetime.datetime.strptime(t, "%Y%m%d%H%M%S")
print(d)
epoch = datetime.datetime.utcfromtimestamp(0)


def unix_time_millis(dt):
  return (dt - epoch).total_seconds() * 1000

unix_time_millis(d)

Дайте мне знать, если это поможет!

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