python - 动态地将时间戳转换为天真的日期时间
问题描述
这是以动态方式将字符串时间转换为天真的日期时间对象的有效解决方案吗?动态我的意思是无论运行此代码的服务器位于何处,我总是会得到一个天真的日期时间对象。我害怕在这里遗漏一些东西
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时间戳,自动检测我系统的时区在这个过程中。
解决方案
所以简而言之,你想解析一个没有时区信息的字符串,但你会假设它的时区,并将其转换为 UTC,也许转换为 UTC 中的一个天真的时间戳。我不知道您关于时区是系统时间的假设有多可靠,但这需要您自己弄清楚。
让我们从这个注释开始:
对于上述时区常量([...]
timezone
[...]),该值由在模块加载时或最后一次tzset()
调用时有效的时区规则确定,并且对于过去的时间可能不正确。建议使用tm_gmtoff
andtm_zone
results 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)
推荐阅读
- javascript - Discord.JS 从用户 ID 获取成员
- swift - 如何让应用在登录时自动识别当前用户 Firestore 文档 ID?
- git - 如何只提交部分文件?
- python - python中优雅的多维循环
- java - 如何从 API 响应字符串中获取一周内的餐厅营业日列表
- r - 如何使用renderUI闪亮应用R显示文本框编号的值
- reactjs - 在 Wordpress Gutenberg 侧边栏中将状态从子组件传递到父组件
- security - 如何在 Quarkus / Wildfly 中验证/比较/相等 BCrypt 散列密码与给定密码
- typescript - 在类型 ts(7053) 上找不到带有“字符串”类型参数的索引签名
- openvino - Openvino xml文件图形输出形状不符合预期