时间戳如下-
2015-07-17 06:01:51.066141+00:00
我正在寻找将其转换为unix日期时间的方法。
datetime.strptime("2015-07-17 06:01:51.066141+00:00", "%Y-%m-%d %H:%M:%S.%f%z").strftime("%s")
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S.%f%z'
为我抛出错误,可能是因为使用了错误的格式。
PS: my virtualenv is on python 2.7
python 2.7 strptime()不支持z指令,您可以使用python 3.2+或其他第三方库,如dateutil。
, Python 2.7 使用箭头:
import arrow
date_str = "2015-07-17 06:01:51.066141+00:00"
unix_time = arrow.get(date_str).timestamp
On PY3(在3.4上验证),仅使用标准库
您显示的日期字符串将不会被标准python datetime库解析,因为它在时区中有一个冒号(参见这里)。可以很容易地删除冒号,因为它总是在相同的位置(或者使用rfind从右侧开始查找它的索引)。最简单的解决方案是:
import datetime
date_str = "2015-07-17 06:01:51.066141+00:00"
date_str_no_colon = date_str[:-3]+date_str[-2:] # remove last colon
dt_obj = datetime.datetime.strptime(date_str_no_colon, "%Y-%m-%d %H:%M:%S.%f%z")
unix_time = dt_obj.timestamp()
请注意,箭头应该仍然可以与PY3一起工作,并且通常是一个更好的解决方案-您不想与python进行日期时间解析战争。它会赢。
解析日期的方法不对。您要么需要手工解析它,找到支持该格式的另一个库(例如,dateutil.parser.parse
方法将直接解析您的字符串而不提供格式字符串),要么将时间戳转换为另一种格式。即使使用较新版本的python, %z
指令也不接受+/-HH:MM
格式的TZ偏移量(带冒号)。
作为时间戳的来源是django.DateTimeField
也许这个问题可以帮助?
要转换为unix时间戳,您似乎必须做一些工作,因为似乎没有直接的方法:
(t - datetime.utcfromtimestamp(0)).total_seconds()
其中t
是datetime
(假设它在UTC中并且没有tzinfo
),您想要转换为POSIX时间戳。如果假设不正确,您需要将tzinfo
放在您减去的0时间戳中,如下所示,假设不成立。
如果你想使用dateutil.parser
,完整的解决方案是:
(dateutil.parser.parse(timestamp) - datetime.utcfromtimestamp(0).replace(tzinfo=utc()).total_seconds()
strptime()不支持时区。因此,您可以通过以下方式忽略时区进行转换:
datetime.strptime("2015-07-17 06:01:51.066141", "%Y-%m-%d %I:%M:%S.%f").strftime("%s")
'1437102111'
或者为了避免使用%s,如下面的注释所示:
from datetime import datetime
(datetime.strptime("2015-07-17 06:01:51.066141", "%Y-%m-%d %I:%M:%S.%f") - datetime(1970, 1, 1)).total_seconds()
1437112911.066141
注意这是Python 2的工作版本,你也可以在这里查看其他版本的解决方案
否则,你将不得不使用其他库(django。Utils或email.utils)支持时区,或者自己实现时区解析。
注::
strptime文档似乎支持时区,但实际上还没有实现。试一试:
datetime.strptime("2015-07-17 06:01:51.066141+00:00", "%Y-%m-%d %I:%M:%S.%f%z").strftime("%s")
,您将看到它不被支持。您还可以通过搜索更多关于strptime()
分为两部分:
将
"2015-07-17 06:01:51.066141+00:00"
转换为代表UTC时间的datetime对象,请参见使用strptime将带偏移的时间戳转换为datetime对象。或者如果你知道utc偏移量总是+0000
:from datetime import datetime utc_time = datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S.%f+00:00")
将UTC时间转换为POSIX时间戳(unix时间),请参见转换日期时间。Python中的date到UTC时间戳:
from datetime import datetime timestamp = (utc_time - datetime(1970, 1, 1)).total_seconds()