Как создать метку времени Unix, которая не корректируется по местному времени? - PullRequest
5 голосов
/ 23 июля 2010

Итак, у меня есть объекты даты и времени в формате UTC, и я хочу преобразовать их в метки времени UTC.Проблема в том, что time.mktime корректирует местное время.

Итак, вот какой-то код:

import os
import pytz
import time
import datetime

epoch = pytz.utc.localize(datetime.datetime(1970, 1, 1))
print time.mktime(epoch.timetuple())

os.environ['TZ'] = 'UTC+0'
time.tzset()
print time.mktime(epoch.timetuple())

Вот какой-то вывод:

Python 2.6.4 (r264:75706, Dec 25 2009, 08:52:16) 
[GCC 4.2.1 (Apple Inc. build 5646) (dot 1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import pytz
>>> import time
>>> import datetime
>>> 
>>> epoch = pytz.utc.localize(datetime.datetime(1970, 1, 1))
>>> print time.mktime(epoch.timetuple())
25200.0
>>> 
>>> os.environ['TZ'] = 'UTC+0'
>>> time.tzset()
>>> print time.mktime(epoch.timetuple())
0.0

Так что, очевидно, если система работает в UTC, не проблема, но когданет, это проблема.Установка переменной среды и вызов time.tzset работает, но безопасно ли это?Я не хочу настраивать его для всей системы.

Есть ли другой способ сделать это?Или это так безопасно называть time.tzset.

1 Ответ

6 голосов
/ 23 июля 2010

Модуль calendar содержит calendar.timegm, который решает эту проблему.

calendar.timegm (кортеж)

Не связанная, но удобная функция, которая принимает временный кортеж, напримервозвращается функцией gmtime() в модуле time и возвращает соответствующее значение метки времени Unix, предполагая эпоху 1970 года, и кодировку POSIX.Фактически, time.gmtime() и timegm() являются обратными друг другу.

...