для сравнения меток времени UTC из файла журнала с локальными метками времени.
трудно найти название Olson TZ для местного часового пояса портативным способом. К счастью, он не нужен для сравнения.
tzlocal
модуль возвращает pytz часовой пояс, соответствующий местному часовому поясу:
from datetime import datetime
import pytz # $ pip install pytz
from tzlocal import get_localzone # $ pip install tzlocal
tz = get_localzone()
local_dt = tz.localize(datetime(2010, 4, 27, 12, 0, 0, 0), is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc) #NOTE: utc.normalize() is unnecessary here
В отличие от других решений, представленных на данный момент, приведенный выше код позволяет избежать следующих проблем:
- местное время может быть неоднозначным , т. Е. Точное сравнение может быть невозможно для некоторых локальных времен
- Смещение utc может отличаться для одного и того же имени местного часового пояса для дат в прошлом. Некоторые библиотеки, которые поддерживают объекты datetime с учетом часового пояса (например,
dateutil
), не учитывают это
Примечание: чтобы получить объект datetime с учетом часового пояса из наивного объекта datetime, вы должны использовать *:
local_dt = tz.localize(datetime(2010, 4, 27, 12, 0, 0, 0), is_dst=None)
вместо:
#XXX fails for some timezones
local_dt = datetime(2010, 4, 27, 12, 0, 0, 0, tzinfo=tz)
*is_dst=None
вызывает исключение, если заданное местное время неоднозначно или отсутствует.
Если вы уверены, что все локальные временные метки используют одинаковое (текущее) смещение utc для локального часового пояса, тогда вы можете выполнить сравнение, используя только stdlib:
# convert a naive datetime object that represents time in local timezone to epoch time
timestamp1 = (datetime(2010, 4, 27, 12, 0, 0, 0) - datetime.fromtimestamp(0)).total_seconds()
# convert a naive datetime object that represents time in UTC to epoch time
timestamp2 = (datetime(2010, 4, 27, 9, 0) - datetime.utcfromtimestamp(0)).total_seconds()
timestamp1
и timestamp2
можно сравнивать напрямую.
Примечание:
timestamp1
формула работает, только если смещение UTC в эпоху (datetime.fromtimestamp(0)
) такое же, как сейчас
fromtimestamp()
создает наивный объект datetime в текущем местном часовом поясе
utcfromtimestamp()
создает наивный объект даты-времени в UTC.