如何将Pythondate时间对象转换为秒

道歉为简单的问题…我是新来的Python …我已经search周围,似乎没有任何工作。

我有一堆的date时间对象,我想计算自从过去每一个固定时间(例如自1970年1月1日以来)以来的秒数。

import datetime t = datetime.datetime(2009, 10, 21, 0, 0) 

这似乎只是区分具有不同日子的date:

 t.toordinal() 

任何帮助深表感谢。

1970年1月1日的特殊date有多种select。

对于任何其他开始date,您需要在几秒钟内获得两个date之间的差异。 减去两个date给出了一个timedelta对象,从Python 2.7开始,它有一个total_seconds()函数。

 >>> (t-datetime.datetime(1970,1,1)).total_seconds() 1256083200.0 

开始date通常用UTC来指定,所以为了得到正确的结果,你input这个公式的datetime也应该是UTC。 如果你的datetime时间已经不是UTC,你需要在使用之前将其转换,或者附加一个具有正确偏移量的tzinfo类。

正如在评论中指出的,如果你有一个tzinfo附加到你的datetime那么你也需要一个在开始date,否则减法将失败; 对于上面的示例,如果使用Python 2,则添加tzinfo=pytz.utc如果使用Python 3,则添加tzinfo=timezone.utc

获得Unix时间(1970年1月1日以来的秒数):

 >>> import datetime, time >>> t = datetime.datetime(2011, 10, 21, 0, 0) >>> time.mktime(t.timetuple()) 1319148000.0 

从Python 3.3开始,使用datetime.timestamp()方法变得非常简单。 这当然只有在你需要从1970年1月1号到UTC的秒数时才有用。

 from datetime import datetime dt = datetime.today() # Get timezone naive now seconds = dt.timestamp() 

返回值将是一个甚至几分之一秒的浮点数。 如果date时间是天真的(如上面的例子),那么将假定date时间对象表示当地时间,即它将是从你的位置的当前时间到1970-01-01 UTC的秒数。

int (t.strftime("%s"))也可以

也许脱离主题:从date时间获得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偏移量。 在这个例子中,这是+ 1h,即UTC + 0100。

参考文献:

  • datetime.date.timetuple
  • time.mktime
  • datetime.datetime.fromtimestamp
  • 介绍及时模块说明POSIX时间,1970年代,UTC,TZ,DST …

从python文档:

 timedelta.total_seconds() 

返回持续时间中包含的总秒数。 相当于

 (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 

计算真正的司启用。

请注意,对于非常大的时间间隔(在大多数平台上大于270年),此方法将失去微秒精度。

这个function在2.7版本中是新的。

我试过标准库的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

将表示UTC时间的date时间对象转换为POSIX时间戳 :

 from datetime import timezone seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp() 

将表示本地时区中的时间的date时间对象转换为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只解决scheme可能工作 。

如果您需要<3.3 Python版本的解决scheme,请点击链接。