使用 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_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 偏移信息在此过程中丢失。如果要保留,建议单独存放。
编辑:对不起,我现在意识到你可能遇到了另一个问题,这取决于你的代码 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 的问题的主要内容,如果未能解决你的问题,请参考以下文章
查询 Django 模型时,如何将 Django 中的 DateTimeField 从 UTC 转换为最终用户的时区(通常是 PST)?