将datetime转换为POSIX时间

时间:2008-10-31 21:38:02

标签: python datetime posix

如何在python中将datetime或date对象转换为POSIX时间戳?有一些方法可以从时间戳中创建一个日期时间对象,但我似乎没有找到任何明显的方法以相反的方式进行操作。

6 个答案:

答案 0 :(得分:53)

import time, datetime

d = datetime.datetime.now()
print time.mktime(d.timetuple())

答案 1 :(得分:21)

对于UTC计算,calendar.timegmtime.gmtime的倒数。

import calendar, datetime
d = datetime.datetime.utcnow()
print calendar.timegm(d.timetuple())

答案 2 :(得分:7)

请注意,Python {3.5.2}在datetime个对象中包含built-in method

>>> import datetime
>>> now = datetime.datetime.now() 
>>> now.timestamp() # Local time
1509315202.161655
>>> now.replace(tzinfo=datetime.timezone.utc).timestamp() # UTC
1509329602.161655

答案 3 :(得分:4)

在python中,time.time()可以返回秒作为包含带微秒的小数部分的浮点数。为了将日期时间转换回此表示形式,您必须添加微秒组件,因为直接时间元组不包含它。

import time, datetime

posix_now = time.time()

d = datetime.datetime.fromtimestamp(posix_now)
no_microseconds_time = time.mktime(d.timetuple())
has_microseconds_time = time.mktime(d.timetuple()) + d.microsecond * 0.000001

print posix_now
print no_microseconds_time
print has_microseconds_time

答案 4 :(得分:0)

从posix / epoch到datetime时间戳以及相反的最佳转换:

this_time = datetime.datetime.utcnow() # datetime.datetime type
epoch_time = this_time.timestamp()      # posix time or epoch time
this_time = datetime.datetime.fromtimestamp(epoch_time)

答案 5 :(得分:0)

这取决于

您的日期时间对象时区是否已知或天真?

时区感知

如果知道这很简单

from datetime import datetime, timezone
aware_date = datetime.now(tz=timezone.utc)
posix_timestamp = aware_date.timestamp()

date.timestamp()为您提供了“ POSIX时间戳”

注意:更准确地将其称为it may not be POSIX compliant

时区天真

如果它不知道时区(天真),那么您需要知道它最初所在的时区,以便我们可以使用replace()将其转换为时区已知的日期对象。假设您已将其存储/检索为UTC Naive。在这里,我们创建一个作为示例:

from datetime import datetime, timezone
naive_date = datetime.utcnow()  # this date is naive, but is UTC based
aware_date = naive_date.replace(tzinfo=timezone.utc)  # this date is no longer naive

# now we do as we did with the last one

posix_timestamp = aware_date.timestamp()

为了避免天真的日期引起的问题,最好尽快到达时区的日期(因为Python通常会认为它们是当地时间并且可能使您搞砸)

注意:请注意对时代的理解,因为它取决于平台