You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Athena/Presto:如何将带时区的字符串转换为Timestamp?

嘿,我来帮你搞定这个带时区的时间字符串转datetime的问题!你遇到的情况挺常见的,parse_datetime()可能对这种带微秒和明确时区偏移的格式支持不够,下面给你几个靠谱的解决方案:

方法1:用Python标准库datetime的strptime()精准匹配格式

标准库其实就能直接搞定,核心是要写出和你的时间字符串完全匹配的格式指令。你的字符串格式是YYYY-MM-DD HH:MM:SS.mmm+HH:MM,对应的格式参数如下:

  • %Y:4位年份
  • %m:2位月份
  • %d:2位日期
  • %H:24小时制的小时数
  • %M:分钟
  • %S:秒
  • %f:微秒(哪怕你的字符串只有3位,strptime会自动补零到6位,不影响结果)
  • %z:时区偏移(Python 3.7及以上版本支持带冒号的±HH:MM格式)

直接上代码:

from datetime import datetime

time_str = "2020-07-21 11:19:00.874+00:00"
dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f%z")
print(dt)  # 输出:2020-07-21 11:19:00.874000+00:00
print(type(dt))  # 输出:<class 'datetime.datetime'>

如果你的Python版本低于3.7,%z不支持带冒号的时区格式,这时候只要先把字符串里的+00:00替换成+0000就能解决:

time_str_fixed = time_str.replace("+00:00", "+0000")
dt = datetime.strptime(time_str_fixed, "%Y-%m-%d %H:%M:%S.%f%z")
方法2:用dateutil.parser自动解析(省心首选)

要是不想手动写格式字符串,第三方库python-dateutil绝对是救星——它能自动识别绝大多数时间格式,包括带时区的这种。

先安装库(没装过的话):

pip install python-dateutil

然后几行代码搞定:

from dateutil import parser

time_str = "2020-07-21 11:19:00.874+00:00"
dt = parser.parse(time_str)
print(dt)  # 输出:2020-07-21 11:19:00.874000+00:00
print(type(dt))  # 输出:<class 'datetime.datetime'>

这个方法几乎不用操心格式细节,适合处理各种不规则的时间字符串,日常用起来特别省心。

方法3:用pytz配合标准库(适合复杂时区操作)

如果之后需要做跨时区转换这类复杂操作,pytz是个不错的选择。对于解析当前这个字符串,我们可以先解析为带时区的datetime,再绑定到UTC时区(本身就是UTC,结果一致):

from datetime import datetime
import pytz

time_str = "2020-07-21 11:19:00.874+00:00"
dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f%z").astimezone(pytz.utc)
print(dt)

至于你之前用parse_datetime()失败的原因,大概率是这个函数(比如某些框架内置的版本)对微秒、带冒号的时区偏移这类细节支持有限,所以用上面的方法会更可靠。

内容的提问来源于stack exchange,提问作者Ignasi Mañé

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:32:35