Python 3.3中的字符串转日期和时区

3

如果我使用以下代码删除时区数据,则可以将下面的日期时间转换:

print(datetime.datetime.strptime(cc.text[:25],"%Y-%m-%dT%H:%M:%S.%f"))

然而,当我使用%z或%Z与时区数据一起使用时,我收到了以下错误,请帮我理解我的问题出在哪里,我正在使用Python 3.3,%z应该可以正常工作。

print(datetime.datetime.strptime(cc.text,"%Y-%m-%dT%H:%M:%S.%f%z"))

错误:

ValueError: time data '2014-09-16T19:26:18.5455599+05:30' does not match format '%Y-%m-%dT%H:%M:%S.%f%Z'

1
你的错误信息与你所说尝试的代码不符;错误信息表明你使用了 %Z(大写字母 Z)。 - Martijn Pieters
我尝试了%Z和%z,只是试了一下,%z是当值以数字形式提供时使用的 :) - surpavan
1个回答

3

有两个问题:

  • 毫秒组件的长度为7位,但Python只接受6位。
  • 时区偏移量包含一个:冒号。

去除这两个额外字符可以使strptime()正常工作:

>>> import datetime
>>> cctext = '2014-09-16T19:26:18.5455599+05:30'
>>> cctext[:-7] + cctext[-6:-3] + cctext[-2:]
'2014-09-16T19:26:18.545559+0530'
>>> datetime.datetime.strptime(cctext[:-7] + cctext[-6:-3] + cctext[-2:], "%Y-%m-%dT%H:%M:%S.%f%z")
datetime.datetime(2014, 9, 16, 19, 26, 18, 545559, tzinfo=datetime.timezone(datetime.timedelta(0, 19800)))

谢谢,这解释了为什么我去掉了最后的冒号却没有得到结果;这是一种ISO格式,但我不知道为什么Python不考虑第七毫秒。 - surpavan
@surpavan:datetime对象只有微秒精度。它必须丢弃900纳秒(或以其他方式四舍五入)。您可以在Python问题跟踪器上提交功能请求(自动四舍五入或存储更多数字)。 - jfs
@surpavan:超过6位数字就不再是微秒了;一微秒等于0.000001秒;第7位小数是几十微秒或100纳秒。日期时间对象无法支持比一微秒更小的时间单位。ISO8601标准可能不限制小数位数,但要求通信双方必须达成一致。 - Martijn Pieters
@J.F.Sebastian:我来自VB.net,我从未了解过这个深度,Visual Studios和.Net集成得非常好,以至于让我感到盲目,但是在转向Python之后,仅仅几周的时间,我学到了很多真正的变量、对象和编码问题的深度,这是一个积极的评价。我必须说,每个人都应该从Python开始学习编程:D。谢谢。 - surpavan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接