首页 > 解决方案 > 使用 dateutil 从 PST 转换为 UTC 的问题

问题描述

我的本地机器当前时区是:

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 小时的时间。

标签: pythonpython-3.xdatetimeepochpython-dateutil

解决方案


我无法确定,因为您问题中的代码似乎缺少 and 的定义local_timelocal_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呼叫什么也不做。如果您想要一个将字符串作为输入的函数,用 pattern 解析它,将其'%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()将给出取决于您运行它的计算机的时区设置的结果。


推荐阅读