Я не могу быть уверен, потому что в коде вашего вопроса, по-видимому, отсутствуют определения для local_time
и local_zone
, но я подозреваю, что проблема, с которой вы столкнулись, связана с тем, что timestamp()
дает вам Unixвремя, которое не имеет понятия о часовом поясе - это абсолютная временная метка, выраженная в количестве секунд * начиная с эпохи Unix, соблюдайте:
dt = datetime(2019, 1, 1, tzinfo=tz.gettz("America/Los_Angeles"))
print(dt)
# 2019-01-01 00:00:00-08:00
dt2 = dt.astimezone(tz.UTC)
print(dt2)
# 2019-01-01 08:00:00+00:00
dt
и dt2
оба представляют одно и то же абсолютное времяздесь, но в разных часовых поясах, как вы можете видеть, отражается в разное местное время.Поскольку они представляют один и тот же момент времени, если я преобразую их в timestamp
, я получу одно и то же значение:
print(dt.timestamp())
# 1546329600.0
print(dt2.timestamp())
# 1546329600.0
Информация о смещении UTC теряется в этом процессе.Если вы хотите сохранить его, я рекомендую хранить его отдельно.
Редактировать : Извините, опять же, теперь я понимаю, что у вас может быть еще одна проблема, в зависимости от того, для чего предназначался ваш фрагмент кода.делать в первую очередь.
Поскольку .timestamp()
всегда автоматически конвертируется в UTC, ваш astimezone
звонок ничего не делает.Если вам нужна функция, которая принимает в качестве входных данных строку, анализирует ее с шаблоном '%Y-%m-%dT%H:%M:%S'
, интерпретируя его как время в America/Los_Angeles
(тихоокеанском времени) и возвращая представление эпохи этого, вам нужно следующее:
from datetime import datetime
from dateutil import tz
pattern = '%Y-%m-%dT%H:%M:%S'
PACIFIC = tz.gettz("America/Los_Angeles")
def dtstr_pst_to_epoch(date_string):
# Get datetime with no time zone information attached
naive_time = datetime.strptime(date_string, pattern)
# Reinterpret the naive datetime as being in Pacific time
pacific_time = naive_time.replace(tzinfo=PACIFIC)
# Return epoch representation
return pacific_time.timestamp()
Наивное время интерпретируется как локальное машинное время, что означает, что naive_time.astimezone(tz.UTC)
или naive_time.timestamp()
даст результат, который зависит от настроек часового пояса для компьютера, на котором он запущен.