将日期时间转换为POSIX时间



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

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

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

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

请注意,Python现在(3.5.2)在datetime对象中包含了一个内置的方法:

>>> import datetime
>>> now = datetime.datetime(2020, 11, 18, 18, 52, 47, 874766)
>>> now.timestamp() # Local time
1605743567.874766
>>> now.replace(tzinfo=datetime.timezone.utc).timestamp() # UTC
1605725567.874766 # 5 hours delta (I'm in UTC-5)

在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

这取决于

你的约会时间对象时区是有意识的还是天真的?

时区感知

如果它意识到这是一个简单的

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

作为date.timestamp()给你的"POSIX时间戳";

注意:更准确地称之为epoch/unix时间戳,因为它可能不符合POSIX

时区Naive

如果它不具有时区意识(naive),那么您需要知道它最初位于哪个时区,这样我们就可以使用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通常会认为它们是当地时间,可能会把你搞砸)

注意:还要小心理解epoch,因为它依赖于平台

从posix/eepoch到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)

相关内容

  • 没有找到相关文章

最新更新