使用dateutil

时间:2019-05-21 00:51:25

标签: python python-3.x datetime epoch python-dateutil

我的本​​地计算机当前时区为:

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

1 个答案:

答案 0 :(得分:0)

我不确定,因为您问题中的代码似乎缺少local_timelocal_zone的定义,但是我怀疑您遇到的问题是由于{{1 }}为您提供了一个unix时间,它没有时区的概念-这是自unix时代以来以秒数*表示的绝对时间戳,请注意:

timestamp()

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

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

编辑:很抱歉,我现在意识到您可能还会遇到另一个问题,这取决于您的代码片段最初打算做什么。

由于print(dt.timestamp()) # 1546329600.0 print(dt2.timestamp()) # 1546329600.0 始终自动转换为UTC,因此您的.timestamp()调用没有任何作用。如果您想要一个将字符串作为输入的函数,使用模式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)的结果将取决于运行它的计算机的时区设置。