将时间戳转换为unix日期python
以下是时间戳的外观-将时间戳转换为unix日期python,python,python-2.7,datetime,Python,Python 2.7,Datetime,以下是时间戳的外观- 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' 为我抛出错误,可能是因为使用
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:我的virtualenv在python 2.7上
请提供想法?strtime()不支持时区。
因此,您可以通过以下方式忽略时区进行转换:
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
注意,这是Python2的工作版本,您还可以检查其他版本的解决方案
否则,您将不得不使用其他支持时区的库(django.utils或email.utils),或者自己实现时区解析
另附:
strtime文档似乎支持时区,但实际上尚未实现。尝试:
datetime.strptime("2015-07-17 06:01:51.066141+00:00", "%Y-%m-%d %I:%M:%S.%f%z").strftime("%s")
您将看到它不受支持。您还可以通过搜索有关strtime()的更多信息来验证它。解析日期的方法不正确。您需要手动解析它,或者找到另一个支持该格式的库(例如,
dateutil.parser.parse
方法,该方法将直接解析您的字符串,而不提供格式字符串),或者以另一种格式制作时间戳。即使使用较新版本的python,%z
指令也不接受+/-HH:MM
格式(带冒号)的TZ偏移量
因为时间戳的来源是django.DateTimeField
可能吗
要转换为unix时间戳,您似乎必须做一些工作,因为似乎没有直接的方法:
(t - datetime.utcfromtimestamp(0)).total_seconds()
其中,t
是要转换为POSIX时间戳的datetime
(假设它是UTC,并且没有tzinfo
)。如果假设不正确,则需要将tzinfo
放入减去的零时间戳中,如下所示,假设不成立
如果要使用dateutil.parser
,完整的解决方案是:
(dateutil.parser.parse(timestamp) - datetime.utcfromtimestamp(0).replace(tzinfo=utc()).total_seconds()
对于Python 2.7,请使用: 在PY3上(在3.4上验证),仅使用标准LIB 您显示的日期字符串不会被标准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()
请注意,arrow应该仍然适用于PY3,并且通常是一个更好的解决方案-您不想陷入python的日期时间解析战争。它会赢。python 2.7 strtime()不支持z指令,您可以使用python 3.2+或其他第三方库,如dateutil。有两个部分:
- 要将
转换为表示UTC时间的datetime对象,请参阅。或者,如果您知道utc偏移量始终为“2015-07-17 06:01:51.066141+00:00”
:+0000
from datetime import datetime utc_time = datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S.%f+00:00")
- 要将UTC时间转换为POSIX时间戳(unix时间),请参阅:
。strftime(“%S”)
,请参阅或者是的,strptime
似乎不支持“+hh:mm”样式的UTC偏移量。我认为你应该考虑一下时间戳字符串的来源:它是从哪里来的?你能让它有其他格式吗?您保证使用这种格式吗?datetime可能重复错误,它支持时区,如+0530
(中间没有:冒号),请使用%z
。python不支持%s
符号,这是基础c的strftime()
函数的产物。这只在linux中有效。我不建议人们使用.strftime(“%s”)
@AnandSKumar它以这种方式支持时区,但是strftime
似乎不接受%z
。是的,就像我在中间没有冒号一样,抛出同样的错误--ValueError:‘Z’是一个坏的指令,格式为%y%-m%%d%h:%m:%s%f%Z'有趣!我正在使用python 3.4,工作正常。你是对的,我验证了它不适用于2.7。这个解决方案依赖于更新版本的python,但是我认为这是朝着正确方向迈出的一步。当使用datetime
解析时间戳时,您必须对时区偏移进行类似的解决方法。例如,您可以使用datetime
分别解析UTC偏移量和时间戳的其余部分,然后合并结果。似乎具有您不必解析自己所需的功能。注意:arrow.timestamp
会降低几分之一秒(它返回一个整数时间戳)。创建datetime对象时,我仍然面临问题-datetime.datetime.strTime(“2015-07-17 06:01:01:51.066141+00:00”,%Y-%m-%d%H:%m:%S.%f%z”)ValueError:“z”是一个错误的指令,格式为“%Y-%m-%d%H:%m:%S.%f%z'@user2119554是的,我知道,您必须使用三种方法之一来解析我提到的时间戳(直接使用datetime
模块将无法工作)。时间戳是从哪里来的?它是使用模型创建的。DateTimeField@user2119554你是说django吗?您确定时间戳将以这种方式格式化吗?也许arrow
(GG_Python的回答中提到的可能会帮助您解析时间戳?yeh django,我已经完成了。看起来不错,但是我不确定哪种方法可以帮助我转换到unix日期。-t=arrow.get('2015-07-17 06:01:51.066141+00:00'))注意:%z
即使在Python 3.2+中也不理解utc偏移量中的冒号,请参阅
from datetime import datetime
utc_time = datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S.%f+00:00")
from datetime import datetime
timestamp = (utc_time - datetime(1970, 1, 1)).total_seconds()