繁体   English   中英

将纪元时间戳转换为 datetime.datetime 对象

[英]Convert epoch timestamp to datetime.datetime object

我想将纪元时间戳(例如,et = 1351036517.179364)转换为 datetime.datetime 对象。 到目前为止,我已经使用了 time.ctime(et) 它给了我一串类似“Fri Oct 5 22:20:33 2012”的字符串。

最终,我需要 datetime 对象来计算两个数据点之间的时间差,另一个数据点也是一个 datetime 对象。

谢谢!

值得记住的是时间戳没有关联的时区信息 Unix 时间无疑是 UTC,但在Unix 风格的时间戳中存储本地时间并不罕见。 您必须对照已知参考进行检查才能确定。


如果您的时间戳已经在 UTC (Unix time) 中,您可以使用 Marc B 的建议直接减去两个 unix 时间戳,以获得它们之间差异的秒数。 然后您可能想要创建一个timedelta ,这将允许您使用它轻松操作datetime s(例如,您可以将 timedelta 与日期时间相加或减去)。

datetime.timedelta( seconds= n_seconds )


如果您的时间戳在本地时间,请不要直接减去它们,因为您可能会得到不正确的结果。

相反,您应该首先使用datetime.fromtimestamp将时区附加到每个 datetime ,然后再减去它们以获得 timedelta。

要将timedelta转换回秒数,有timedelta.total_seconds ,假设您使用的是 python 2.7 。 如果您有较早的版本,则必须手动进行计算,或pip install datetime

要将 POSIX 时间戳转换为表示 UTC 时间的datetime.datetime对象:

from datetime import datetime, timedelta, timezone

timestamp = 1351036517.179364
utc_time = datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
# -> 2012-10-23 23:55:17.179363+00:00

如果您的 Python 版本不支持datetime.timezone 您可以省略它,以在 UTC 中获得一个天真的日期时间对象。


我需要 datetime 对象来计算两个数据点之间的时间差,另一个数据点也是一个 datetime 对象。

如果原始datetime对象表示具有不同 UTC 偏移量的本地时间,则您无法直接比较它们,否则您可能会得到错误的结果。 您需要时区感知日期时间对象,或者您应该先将日期时间对象转换为 UTC。

TLDR

使用fromtimestamp作为引用文档中

返回与 POSIX 时间戳对应的本地日期 [...如果提供了 tz...] 时间戳将转换为 [提供] tz 的时区。

给定一个 UNIX / EPOCH 时间戳

这是由 python 生成的此类时间戳的示例(感谢 @jfs 和Paul Ganssle更新)

from datetime import datetime, timezone
epoch = datetime.now(tz=timezone.utc).timestamp()  # example: 1520020585.536527

注意:并非所有纪元都是相同的,使用time.time()将给date.timestamp()依赖平台的纪元以来经过的秒数,其中date.timestamp()为您提供其声称的 POSIX 时间戳,请参阅下面的注意事项

注意:我特别避免将.timestamp()的输出称为“符合 POSIX”的时间戳。 如果您的应用程序依赖于该级别的准确性,那么您可能需要使用.timestamp()以外的其他.timestamp()

注意:使用datetime.now因为它可能会提供更高的精度

注意:我们可以省略上面的tz参数,但是使用时区感知日期是一个好习惯,因为 python 3 在处理原始日期时可能会做出错误的假设(或者不会在我们认为会的地方抛出错误)

将时间戳转换为日期时间对象

给定时间戳(例如1520020585.536527 ),我们可以使用fromtimestamp将其转换为 datetime tz 感知对象, fromtimestamp所示:

from datetime import datetime, timezone
ts = 1520020585.536527  # remember me? I'm the epoch example output from above
utc_date = datetime.fromtimestamp(ts, tz=timezone.utc) # outputs: datetime date object

注意fromtimestamp需要一个“POSIX”时间戳,我们在这里提供的tz只是为了避免幼稚的日期时间对象。 fromtimestamp将为我们提供的时区执行任何需要的转换,但是哪个时区比 UTC 更好,对吗?

注意:尽管 python 文献将fromtimestamp()的输入明确引用为“POSIX”时间戳,但它并没有明确将输入引用为“POSIX 兼容”,因此我们只能从其他部分推断“POSIX”时间戳是什么它的文献,比如当它把 POSIX 输出称为“由 time.time() 返回”时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM