проблема конвертации в UTC из PST с использованием dateutil - PullRequest
1 голос
/ 21 мая 2019

Текущий часовой пояс моей локальной машины:

Mon May 20 17:44:50 PDT 2019

Так что, когда я делаю epoc преобразование 2019-04-01T00:00:00, я получаю: 1554102000

Я должен получить 1554076800в соответствии с www.epochconverter.com

моя функция выглядит следующим образом:

import time
from datetime import datetime
from dateutil import *
from dateutil.tz import *

input =  '2019-04-01T00:00:00'

def convert_to_UTC_epoc(input):
    utc_zone = tz.gettz('UTC')
    pattern = '%Y-%m-%dT%H:%M:%S'
    local_time = local_time.replace(tzinfo=local_zone)
    utc_time = datetime.strptime(date_time,pattern).astimezone(utc_zone)
    epoch = int(utc_time.timestamp())
    return epoch

Я думал, что использование utc_zone = tz.gettz('UTC') переводит его в правильный часовой пояс, но по какой-то причине я все еще 7 часоввыкл.

1 Ответ

0 голосов
/ 22 мая 2019

Я не могу быть уверен, потому что в коде вашего вопроса, по-видимому, отсутствуют определения для 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() даст результат, который зависит от настроек часового пояса для компьютера, на котором он запущен.

...