7

我正在尝试将日期字符串解码为纪元,但我很难获得时区。这是 Amazon S3 密钥的最后修改日期。

time.strptime(key.last_modified, '%Y-%m-%dT%H:%M:%S.%Z')

ValueError: time data u'2013-10-20T00:41:32.000Z' 
            does not match format '%Y-%m-%dT%H:%M:%S.%Z'

如果我摆脱时区(.000Z)它可以工作,但我也需要时区。

4

2 回答 2

9

.000Z不被识别为时区偏移。实际上,您有毫秒和时区(Z是 UTC),而官方解析器time.strptime()无法处理毫秒。在某些平台上%f会解析微秒部分,然后丢弃信息。

然而,datetime.datetime.strptime()类方法可以,但不是时区;将其解析Z为文字,它可以工作:

from datetime import datetime

datetime.strptime(key.last_modified, '%Y-%m-%dT%H:%M:%S.%fZ')

演示:

>>> from datetime import datetime
>>> import time
>>> example = u'2013-10-20T00:41:32.000Z'
>>> datetime.strptime(example, '%Y-%m-%dT%H:%M:%S.%fZ')
datetime.datetime(2013, 10, 20, 0, 41, 32)
>>> time.strptime(example, '%Y-%m-%dT%H:%M:%S.%fZ')
time.struct_time(tm_year=2013, tm_mon=10, tm_mday=20, tm_hour=0, tm_min=41, tm_sec=32, tm_wday=6, tm_yday=293, tm_isdst=-1)

请注意,在我的 Mac OS X 笔记本电脑上,%f适用于time.strptime(); 但是,它不能保证在任何地方都可以工作。

datetime.datetime()可以使用datetime.timetuple()方法将对象转换为时间元组。

于 2013-10-20T01:16:38.190 回答
4

2013-10-20T00:41:32.000Z

在这个字符串中,32.000 是秒,精确到千位。'Z' 是 UTC 的时区,俗称祖鲁时间。

如果您查看Python 2.x 文档中的此%S,则该参数只能处理范围 [00, 61] (含)且没有小数点。61 是为了说明闰秒。这就是您的字符串格式不匹配的原因。您需要从字符串中删除小数点后面的三个零。

于 2013-10-20T01:44:45.453 回答