Ваша проблема в том, что вы используете наивные datetime
(и struct_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
, который делает то же самое более запутанным образом.