首页 > 解决方案 > 动态地将时间戳转换为天真的日期时间

问题描述

这是以动态方式将字符串时间转换为天真的日期时间对象的有效解决方案吗?动态我的意思是无论运行此代码的服务器位于何处,我总是会得到一个天真的日期时间对象。我害怕在这里遗漏一些东西

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时间戳,自动检测我系统的时区在这个过程中。

标签: pythonpython-3.xdatetime

解决方案


所以简而言之,你想解析一个没有时区信息的字符串,但你会假设它的时区,并将其转换为 UTC,也许转换为 UTC 中的一个天真的时间戳。我不知道您关于时区是系统时间的假设有多可靠,但这需要您自己弄清楚。

让我们从这个注释开始:

对于上述时区常量([...] timezone[...]),该值由在模块加载时或最后一次tzset()调用时有效的时区规则确定,并且对于过去的时间可能不正确。建议使用tm_gmtoffand tm_zoneresults fromlocaltime()来获取时区信息。

所以,让我们先from time import timezone as diff_to_utc用这个替换:

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)

然后通过将您确定的时区信息(以任何方式)添加到它来使时间戳知道:

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:

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

如果你不知何故需要它,让它再次天真:

naive_utc = utc.replace(tzinfo=None)
# datetime.datetime(2018, 9, 15, 13, 30)

推荐阅读