为这个简单的问题表示歉意...我是Python的新手...我四处搜寻,似乎没有任何反应。
我有一堆datetime对象,我想计算每个对象过去某个固定时间以来的秒数(例如,自1970年1月1日起)。
import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)
这似乎只能区分具有不同日期的日期:
t.toordinal()
任何帮助深表感谢。
int(t.timestamp())
为这个简单的问题表示歉意...我是Python的新手...我四处搜寻,似乎没有任何反应。
我有一堆datetime对象,我想计算每个对象过去某个固定时间以来的秒数(例如,自1970年1月1日起)。
import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)
这似乎只能区分具有不同日期的日期:
t.toordinal()
任何帮助深表感谢。
int(t.timestamp())
Answers:
在1970年1月1日这个特殊日期,有多种选择。
对于任何其他开始日期,您需要以秒为单位获取两个日期之间的差额。将两个日期相减得到一个timedelta
对象,从Python 2.7开始,该对象具有total_seconds()
功能。
>>> (t-datetime.datetime(1970,1,1)).total_seconds()
1256083200.0
通常以UTC指定开始日期,因此,要获得正确的结果,datetime
您也应使用UTC输入该公式。如果您datetime
尚未使用UTC,则需要先进行转换,再使用它,或附加tzinfo
具有适当偏移量的类。
如评论中所述,如果您有tzinfo
附件,datetime
则在开始日期也需要一个附件,否则减法将会失败;对于上面的示例,tzinfo=pytz.utc
如果使用Python 2或tzinfo=timezone.utc
Python 3 ,我会添加。
datetime.datetime(1970,1,1,tzinfo=pytz.utc)
。
datetime.datetime.utcfromtimestamp(0)
我已经使用它来轻松获得“时代”。请注意,在所有系统上,纪元并不总是相同的。
time.time()
和datetime.now() - datetime(1970, 1, 1)
通过7200秒不同。宁可使用(t - datetime.datetime.fromtimestamp(0)).total_seconds()
。千万不能使用utcfromtimestamp(0)
,如果你想将时间值转换在您的本地时区。
要获取Unix时间(自1970年1月1日以来的秒数):
>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0
t
是当地时间。本地时区的UTC偏移量过去可能有所不同,并且mktime()
(C库)无法访问给定平台上的历史时区数据,否则可能会失败(这pytz
是可访问tz数据库的可移植方式)。另外,本地时间可能是模棱两可的,例如在DST转换期间-您需要其他信息来消除歧义,例如,如果您知道日志文件中的连续日期/时间值应该增加
time.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())
结果为1564819506.0
,默默地降低了毫秒,但是datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()
(Andrzej Pronobis的答案)结果1564819506.912
为预期结果。
从Python 3.3开始,使用此datetime.timestamp()
方法变得非常容易。当然,这仅在需要从1970-01-01 UTC开始的秒数时才有用。
from datetime import datetime
dt = datetime.today() # Get timezone naive now
seconds = dt.timestamp()
返回值将是代表偶数秒的浮点数。如果datetime是时区朴素的(如上例所示),则将假定datetime对象代表本地时间,即,它是从您所在位置的当前时间到1970-01-01 UTC的秒数。
也许离题:从日期时间获取UNIX / POSIX时间并将其转换回:
>>> import datetime, time
>>> dt = datetime.datetime(2011, 10, 21, 0, 0)
>>> s = time.mktime(dt.timetuple())
>>> s
1319148000.0
# and back
>>> datetime.datetime.fromtimestamp(s)
datetime.datetime(2011, 10, 21, 0, 0)
请注意,不同的时区会影响结果,例如我当前的TZ / DST返回:
>>> time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
-3600 # -1h
因此,应该考虑使用功能的UTC版本将其标准化为UTC。
请注意,先前的结果可用于计算您当前时区的UTC偏移量。在此示例中,这是+1小时,即UTC + 0100。
参考文献:
mktime()
可能会失败。通常,您需要pytz
将本地时间转换为utc,以获得POSIX时间戳。
int (t.strftime("%s"))
也可以
import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)
(由OP指定)。但实际上,我怀疑%s是最近添加的时间格式。
%s
不支持(如果t
是表示本地时间的幼稚datetime对象,并且如果本地C库可以访问tz数据库,则它可能在某些平台上有效,否则结果可能是错误的)。不要使用它。
%s
没有记录在任何地方。我将其播种在真实代码中,想知道这是什么,然后查看文档,就没有这样的东西%s
。仅在几秒钟内就有大S。
从python文档:
timedelta.total_seconds()
返回持续时间中包含的总秒数。相当于
(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
在启用真除法的情况下进行计算。
请注意,对于非常长的时间间隔(在大多数平台上大于270年),此方法将失去微秒的精度。
此功能是2.7版中的新增功能。
要将代表UTC时间的datetime对象转换为POSIX时间戳:
from datetime import timezone
seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()
要将代表本地时区中时间的datetime对象转换为POSIX时间戳,请执行以下操作:
import tzlocal # $ pip install tzlocal
local_timezone = tzlocal.get_localzone()
seconds_since_epoch = local_timezone.localize(local_time, is_dst=None).timestamp()
请参阅如何在Python中将本地时间转换为UTC?如果tz数据库在给定平台上可用;仅有stdlib的解决方案可能有效。
如果您需要<3.3
Python版本的解决方案,请点击链接。
我尝试了标准库的calendar.timegm,它工作得很好:
# convert a datetime to milliseconds since Epoch
def datetime_to_utc_milliseconds(aDateTime):
return int(calendar.timegm(aDateTime.timetuple())*1000)
参考:https : //docs.python.org/2/library/calendar.html#calendar.timegm
aDateTime
是一个UTC时间
datetime.date
为UTC时间戳