сравнить временные метки UTC из файла журнала с местными временными метками.
Это hard to find out Olson TZ name for a local timezone портативным способом. К счастью, вам не нужно его выполнять.
tzlocal
module возвращает часовой пояс 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
В отличие от других решений, представленных до сих пор выше код позволяет избежать следующих проблем:
- local time can be ambiguous т.е. точное сравнение может быть невозможно для некоторых местных времен
- Учет офсетной программы может отличаться для того же локального часового пояса для дат в прошлом. Некоторые библиотеки, которые поддерживают часовой пояс-зависимые объекты даты-времени (например,
dateutil
) не принимать это во внимание
Примечание: чтобы получить часовой пояс-Aware объект 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()
создает наивный объект datetime в UTC.
Вашей проблемы сомнителен, чтобы начать с. В зависимости от того, что вы делаете, есть хорошие шансы на создание условия гонки вблизи перехода на летнее время (или в любую другую ситуацию, когда меняется местный часовой пояс). – Kevin