Python datetime.date.date.fromtimestamp()方法

datetime 库是内置的,是一个丰富的 Python 库,它提供了各种实用工具,如类、方法、结构和属性,以处理日期、时间、日期和时间的组合 (DateTime)、时区和 timedelta (时间差)。

这个模块包含一个类,即date ,它简化了处理日期的流程。这个类有几个方法,允许开发人员从字符串格式、时间戳、ISO格式和序数中创建date 对象。

本文将全面讨论一个成员函数,fromtimestamp() ,它帮助我们从POSIX或便携式操作系统接口的时间戳中创建date 对象。POSIX时间戳也被称为Unix时间戳。

POSIX是一个将时间表示为自00:00:00 UTC on 1 January 1970 以来所经过的秒数的系统。这个日期也被称为Unixepoch

语法

datetime.date.fromtimestamp(timestamp)

参数

要获得一个POSIX或便携式操作系统接口的时间戳,我们可以使用datetime 对象上的timestamp() 方法。该方法返回一个代表POSIX时间戳的浮点数。

返回值

fromtimestamp() 方法返回与POSIX或Unix时间戳相关的本地日期。

例子1:从具有时区意识的datetime 对象中获取POSIX时间戳

在了解时间的datetime 对象中,获取时间戳是很直接的。在内部,下面指令的返回值是timestamp() 方法的结果。

(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

请参考下面的Python代码。

import datetime
cet = datetime.timezone(datetime.timedelta(hours = 2), name = "CET")
dt = datetime.datetime(2022, 3, 3, 13, 44, 5, 992991, cet)
print("DateTime:", dt)
print("Timestamp:", dt.timestamp())

输出:

DateTime: 2022-03-03 13:44:05.992991+02:00
Timestamp: 1646307845.992991

例2:从Naivedatetime 对象中获取POSIX时间戳

有两种方法可以在不知道时区的天真datetime 对象中获取时间戳。在不使用即将到来的两种方法的情况下,使用timestamp() 来获取POSIX时间戳是可能的,但有时,timestamp() 方法会引发一个OverflowError

它这样做是因为它使用C平台中可用的mktime() 方法来计算时间戳,并假定天真的对象存储了本地系统时间。此外,datetime 对象对一个巨大的值域进行操作,而这些值域并不经常使用mktime() 方法来获得。

因此,我们会出现异常。要了解更多信息,请参考这里的官方文档。

再来看看这两种方法,在第一种方法中,我们手动将datetime 对象的时区设置为UTC,然后调用timestamp() 方法。关于这种方法,请参考下面的Python代码。

import datetime
dt = datetime.datetime(2022, 3, 3, 13, 44, 5, 992991)
print("DateTime:", dt)
timestamp = dt.replace(tzinfo = datetime.timezone.utc).timestamp()
print("Timestamp:", timestamp)

输出:

DateTime: 2022-03-03 13:44:05.992991
Timestamp: 1646315045.992991

而在第二种方法中,我们通过执行一些datetime 对象的数学运算来计算时间。请参考下面的Python代码来了解这种方法。

import datetime
dt = datetime.datetime(2022, 3, 3, 13, 44, 5, 992991)
print("DateTime:", dt)
timestamp = (dt - datetime.datetime(1970, 1, 1)) / datetime.timedelta(seconds = 1)
print("Timestamp:", timestamp)

输出:

DateTime: 2022-03-03 13:44:05.992991
Timestamp: 1646315045.992991

例3:使用fromtimestamp() ,从POSIX时间戳中获取本地日期

import datetime
dt = datetime.datetime(2022, 3, 3, 13, 44, 5, 992991)
print("DateTime:", dt)
timestamp = dt.replace(tzinfo = datetime.timezone.utc).timestamp()
print("POSIX Timestamp:", timestamp)
print("Local Date:", datetime.date.fromtimestamp(timestamp))

输出:

DateTime: 2022-03-03 13:44:05.992991
POSIX Timestamp: 1646315045.992991
Local Date: 2022-03-03

上面的Python代码首先创建了一个天真的datetime 对象。接下来,我们上面讨论的第一个方法从datetime 对象中获取时间戳。

接下来,fromtimestamp() 类方法从 POSIX 时间戳中提取本地日期。

例子4:使用时出现的错误和异常情况fromtimestamp()

OverflowError

fromtimestamp() 方法,万一timestamp 超出了平台Clocaltime() 方法支持的数值范围,就会引发一个OverflowError 错误。请参考下面的Python代码作为例子。

import datetime
dt = datetime.datetime(2022, 3, 3, 13, 44, 5, 992991)
print("DateTime:", dt)
timestamp = 3242534300897987609534.2342352
print("POSIX Timestamp:", timestamp)
print("Local Date:", datetime.date.fromtimestamp(timestamp))

输出:

DateTime: 2022-03-03 13:44:05.992991
POSIX Timestamp: 3.2425343008979875e+21
Traceback (most recent call last):
  File "main.py", line 7, in <module>
    print("Local Date:", datetime.date.fromtimestamp(timestamp))
OverflowError: timestamp out of range for platform time_t

ValueError

fromtimestamp() 方法(万一时间戳代表一个无效的年份值)引发一个ValueError 错误。请参考下面的Python代码中的一个例子。

import datetime
dt = datetime.datetime(2022, 3, 3, 13, 44, 5, 992991)
print("DateTime:", dt)
timestamp = -100000000000
print("POSIX Timestamp:", timestamp)
print("Local Date:", datetime.date.fromtimestamp(timestamp))

输出结果:

DateTime: 2022-03-03 13:44:05.992991
POSIX Timestamp: -100000000000
Traceback (most recent call last):
  File "main.py", line 7, in <module>
    print("Local Date:", datetime.date.fromtimestamp(timestamp))
ValueError: year -1199 is out of range

OSError

fromtimestamp() 方法,如果内部调用的localtime() 方法失败,引发OSError 错误。