动态将时间戳转换为原始日期时间

时间:2018-09-04 10:07:23

标签: python python-3.x datetime

这是一种以动态方式将字符串时间转换为原始日期时间对象的有效解决方案吗? 动态是指无论运行此代码的服务器位于何处,我总是会遇到一个朴素的datetime对象。我怕这里缺少东西

from time import timezone as diff_to_utc
from datetime import datetime, timedelta


time_str = "2018-09-15T15:30:00"  # here for example CEST
time_dt_utc = datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S") + \
              timedelta(seconds=diff_to_utc)
time_dt_utc
>> datetime.datetime(2018, 9, 15, 14, 30)

更新以澄清我的问题

我有一个朴素的时间戳(没有时区信息的时间数据)来自于一个网站的抓取,我假设该网站将始终位于服务器的时区(但不包含该信息),并且我想从系统时区转换该朴素的时间戳放入UTC时间戳记,即可自动检测出系统中的时区。

1 个答案:

答案 0 :(得分:0)

因此,总而言之,您想解析一个没有时区信息的字符串,但是您将假设其时区,将其转换为UTC,或者转换为UTC的简单时间戳。我不知道您对时区为系统时间的假设有多可靠,但这是由您确定的。

让我们从此注释开始:

  

对于上述时区常量([...] timezone [...]),该值由模块加载时或上一次tzset()生效的时区规则确定已被调用,过去可能不正确。 建议使用tm_gmtoff的{​​{1}}和tm_zone结果来获取时区信息。

因此,我们首先将localtime()替换为:

from time import timezone as diff_to_utc

然后,您只需将字符串解析为一个简单的datetime对象:

import time

local_offset = time.localtime().tm_gmtoff

然后通过将您确定的时区信息(以任何方式)添加到该时间戳记中来

from datetime import datetime

time_str = '2018-09-15T15:30:00'
naive = datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S')
# datetime.datetime(2018, 9, 15, 15, 30)

然后,如果需要,将其转换为UTC:

from datetime import timezone, timedelta

aware = naive.astimezone(timezone(timedelta(seconds=local_offset)))
# datetime.datetime(2018, 9, 15, 15, 30, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

如果您以某种方式需要它,请再次使其变得天真:

utc = aware.astimezone(timezone.utc)
# datetime.datetime(2018, 9, 15, 13, 30, tzinfo=datetime.timezone.utc)