【问题标题】:string to date with Timezone in python 3.3python 3.3中带有时区的字符串
【发布时间】:2014-09-16 13:49:23
【问题描述】:

如果我使用代码修剪时区数据,我可以转换以下日期时间:

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'

【问题讨论】:

  • 您的错误信息与您说您尝试过的代码不符;错误消息指出您使用了 %Z(大写 Z)。
  • 我尝试了 %Z 和 %z,只是试了一下,%z 是作为数字提供的值:)

标签: python datetime python-3.x


【解决方案1】:

有两个问题:

  • 毫秒部分的长度为 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不应该考虑第7毫秒。
  • @surpavan:日期时间对象只有微秒精度。它必须下降 900 纳秒(或以其他方式舍入)。您可以在Python Issue tracker 上提交功能请求(自动舍入或存储更多数字)
  • @surpavan:任何超过 6 位的数字都不再是微秒;微秒 us 0.000001 秒;第 7 位小数是几十微秒或 100 纳秒。日期时间对象不能支持小于一微秒的任何内容。 ISO8601 可能不会限制小数位数,但会声明通信双方需要就限制达成一致。
  • @J.F.Sebastian:我来自 VB.net,我从来没有接触过这种深度,Visual Studios 和 .Net 的集成度如此之高,以至于它们让我视而不见,但在接触 python 之后,我只是一个几周的时间里,我学到了很多真正的变量、对象和深入的编码问题,这是一个积极的评论。我必须说,每个人都必须从 python 开始学习编码:D。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-03-04
  • 2012-05-04
  • 1970-01-01
  • 2020-10-05
  • 2017-09-08
  • 2013-12-19
  • 2012-05-16
  • 1970-01-01
相关资源
最近更新 更多