使用 dateutil 从 PST 转换为 UTC 的问题

Posted

技术标签:

【中文标题】使用 dateutil 从 PST 转换为 UTC 的问题【英文标题】:issue converting to UTC from PST using dateutil 【发布时间】:2019-10-07 08:18:06 【问题描述】:

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

Mon May 20 17:44:50 PDT 2019

所以当我对2019-04-01T00:00:00 进行 epoc 转换时,我得到:1554102000

根据 www.epochconverter.com,我应该得到1554076800

我的函数如下所示:

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

【问题讨论】:

似乎没有足够的信息来了解这里发生了什么。 local_time 在定义之前使用,local_zone 从不定义。 【参考方案1】:

我无法确定,因为您问题中的代码似乎缺少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

dtdt2 在这里都代表相同的绝对时间,但是在不同的时区,正如你所看到的反映在不同的当地时间。因为它们代表同一时刻,如果我将它们转换为timestamp,我会得到相同的值:

print(dt.timestamp())
# 1546329600.0

print(dt2.timestamp())
# 1546329600.0

UTC 偏移信息在此过程中丢失。如果要保留,建议单独存放。

编辑:对不起,我现在意识到你可能遇到了另一个问题,这取决于你的代码 sn-p 最初打算做什么。

因为.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() 将给出取决于您运行它的计算机的时区设置的结果。

【讨论】:

以上是关于使用 dateutil 从 PST 转换为 UTC 的问题的主要内容,如果未能解决你的问题,请参考以下文章

将UTC时间转换为PST以获得夏令时?

查询 Django 模型时,如何将 Django 中的 DateTimeField 从 UTC 转换为最终用户的时区(通常是 PST)?

将 PDT/PST 时区列转换为 UTC 时区

将 PST 中的日期与时间转换为 UTC 格式

如何在 Python 中获取 GMT 并将其转换为 PST

python / pytz问题从本地时区转换为UTC然后返回