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

Python 将历元时间戳转换为datetime.datetime对象,python,datetime,epoch,Python,Datetime,Epoch,我想将一个历元时间戳(例如et=1351036517.179364)转换为datetime.datetime对象。到目前为止,我使用了time.ctimeet,它给了我一系列类似于2012年10月5日星期五22:20:33的信息 最后,我需要datetime对象来计算两个数据点之间的时间差,另一个数据点也是datetime对象 谢谢 值得记住的是,时间戳没有相关的时区信息。 是明确的UTC,但以Unix样式的时间戳存储本地时间并不少见。您必须对照已知的引用进行检查以确保 如果时间戳已经是UTC

我想将一个历元时间戳(例如et=1351036517.179364)转换为datetime.datetime对象。到目前为止,我使用了time.ctimeet,它给了我一系列类似于2012年10月5日星期五22:20:33的信息

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


谢谢

值得记住的是,时间戳没有相关的时区信息。 是明确的UTC,但以Unix样式的时间戳存储本地时间并不少见。您必须对照已知的引用进行检查以确保

如果时间戳已经是UTC Unix时间,可以使用Marc B的建议直接减去两个Unix时间戳,以获得它们之间的差秒数。 然后,您可能希望创建一个,这将允许您轻松地使用它操作日期时间。例如,您可以对日期时间求和或从中减去时间增量

datetime.timedelta秒=n_秒

如果时间戳是本地时间,不要直接减去它们,因为可能会得到错误的结果

相反,您应该先使用,然后再减去它们得到时间增量


要将timedelta转换回秒数,假设您使用的是Python2.7。如果您使用的是早期版本,则必须手工计算,或者使用pip install datetime

记住,时间戳没有相关的时区信息。 是明确的UTC,但以Unix样式的时间戳存储本地时间并不少见。您必须对照已知的引用进行检查以确保

如果时间戳已经是UTC Unix时间,可以使用Marc B的建议直接减去两个Unix时间戳,以获得它们之间的差秒数。 然后,您可能希望创建一个,这将允许您轻松地使用它操作日期时间。例如,您可以对日期时间求和或从中减去时间增量

datetime.timedelta秒=n_秒

如果时间戳是本地时间,不要直接减去它们,因为可能会得到错误的结果

相反,您应该先使用,然后再减去它们得到时间增量


要将timedelta转换回秒数,假设您使用的是Python2.7。如果您使用的是早期版本,则必须手动进行计算,或pip安装datetime将POSIX timestamp转换为以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对象

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


要将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对象

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

太长,读不下去了 使用引用的fromtimestamp

返回对应于POSIX时间戳的本地日期[…如果提供了tz…],则时间戳将转换为[提供的]tz的时区

给定UNIX/EPOCH时间戳 下面是一个由pythonupdated生成的时间戳示例,感谢@jfs和

注意:并非所有的历元都是相同的,并且使用time.time将给出从a开始经过的秒数,其中as date.timestamp给出了下面的注意事项

注意:我特别避免调用.timestamp的输出与POSIX兼容的时间戳。如果您的应用程序需要,那么您可能需要使用.timestamp以外的内容

注意:使用datetime.now(视情况而定)

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

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

注意:fromtimestamp需要一个POSIX时间戳,我们在这里提供的tz只是为了避免幼稚的datetime对象。fromtimestamp将执行 对我们提供的时区进行任何必要的转换,但什么时区比UTC更好,对吗

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

TLDR 使用引用的fromtimestamp

返回对应于POSIX时间戳的本地日期[…如果提供了tz…],则时间戳将转换为[提供的]tz的时区

给定UNIX/EPOCH时间戳 下面是一个由pythonupdated生成的时间戳示例,感谢@jfs和

注意:并非所有的历元都是相同的,并且使用time.time将给出从a开始经过的秒数,其中as date.timestamp给出了下面的注意事项

注意:我特别避免调用.timestamp的输出与POSIX兼容的时间戳。如果您的应用程序需要,那么您可能需要使用.timestamp以外的内容

注意:使用datetime.now(视情况而定)

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

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

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


注意:尽管python文献明确地将fromtimestamp的输入引用为POSIX时间戳,但并未明确地将输入引用为POSIX兼容,因此我们只能从其文献的其他部分推断POSIX时间戳是什么,比如当它引用POSIX输出时,返回的是时间。时间

时间戳可以直接减去以秒为单位的时间差。时间戳可以直接减去以秒为单位的时间差。明白了。非常感谢@goncalopp和Marc B!这是错误的。在本地时间中没有unix时间戳这样的东西。1351036517.179364 unix时间戳对应于巴黎的2012-10-24T01:55:17.179363,纽约的2012-10-23T19:55:17.179363。您可以直接子结构时间戳-如果忽略SI秒和平均solart UT1秒之间的差异,它们是从历元经过秒起的秒数。忽略闰秒,换句话说。@J.F.Sebastian从技术上讲,你是对的,因为这就是unix时间的定义。但是,对从本地时间获得的时间戳进行编码,就好像它是UTC time.mktimedatetime.now.timetuple vs time.mktimedatetime.utcnow.timetuple一样,这肯定不是闻所未闻的。当然,严格来说,这些不是unix时间戳。我将编辑答案以使其更清晰,不要让人困惑。OP询问epoch timestamp的含义是POSIX timestamp POSIX time。@J.F.Sebastian您还会注意到OP发布了一个示例时间戳,似乎自动假定它是Unix时间。就我个人而言,我以前必须在localtime中解析时间戳,而假设它们是Unix时间,我更希望有人向我指出这一点,而不是坚持人们非正式地称之为Unix时间的所有东西都是UTC时间。嗯,明白了。非常感谢@goncalopp和Marc B!这是错误的。在本地时间中没有unix时间戳这样的东西。1351036517.179364 unix时间戳对应于巴黎的2012-10-24T01:55:17.179363,纽约的2012-10-23T19:55:17.179363。您可以直接子结构时间戳-如果忽略SI秒和平均solart UT1秒之间的差异,它们是从历元经过秒起的秒数。忽略闰秒,换句话说。@J.F.Sebastian从技术上讲,你是对的,因为这就是unix时间的定义。但是,对从本地时间获得的时间戳进行编码,就好像它是UTC time.mktimedatetime.now.timetuple vs time.mktimedatetime.utcnow.timetuple一样,这肯定不是闻所未闻的。当然,严格来说,这些不是unix时间戳。我将编辑答案以使其更清晰,不要让人困惑。OP询问epoch timestamp的含义是POSIX timestamp POSIX time。@J.F.Sebastian您还会注意到OP发布了一个示例时间戳,似乎自动假定它是Unix时间。就我个人而言,我以前必须在localtime中解析时间戳,而假设它们是Unix时间,我更希望有人向我指出这一点,而不是坚持人们非正式地称之为Unix时间的所有东西都是UTC时间。IMMV.DT.datetime.utcnow.timestamp错误。utcnow返回一个没有tzinfo的原始datetime对象。时间戳将原始datetime对象解释为可能具有非零utc偏移量的本地时间。要获取当前的历元时间戳,只需调用time.time。如果
您希望使.timestamp方法工作,然后向其传递一个时区感知的datetime对象,例如DT.datetime.nowDT.timezone.utc.timestamp。反过来,要从epoch timestamp中获取一个时区感知的datetime对象:DT.datetime.fromtimestts,tz,其中tz是所需的时区。@非常感谢jfs花时间指出我的错误并给出更正!我应该仔细阅读文档,因为我是链接到它的。在您的帮助下,我已更新了解决方案。我相信它现在状态良好:Dtext有误导性:fromtimestamp参数seconds,因为epoch不依赖于生成其arg的本地时区。time.time返回的值与您当前所在的本地时区相同。@jfs捕捉得很好,根据您的反馈,我做了一些更新,非常感谢!关键是答案中的代码产生了一个错误的值,而不是它建议应该产生的值。运行我上面提供的示例,亲自查看DT.datetime.nowDT.timezone.utc.timestamp在某些情况下不返回POSIX timestamp。我没有仔细研究它,但我的猜测是,现在UTC与TZ=right/UTC产生不同的时间,但是。时间戳公式对于正确的时区无效。正确的时间戳计数闰秒,并使用不同的历元。DT.datetime.utcnow.timestamp是错误的。utcnow返回一个没有tzinfo的原始datetime对象。时间戳将原始datetime对象解释为可能具有非零utc偏移量的本地时间。要获取当前的历元时间戳,只需调用time.time。如果要使.timestamp方法正常工作,请向其传递一个时区感知的datetime对象,例如DT.datetime.nowDT.timezone.utc.timestamp。反过来,要从epoch timestamp中获取一个时区感知的datetime对象:DT.datetime.fromtimestts,tz,其中tz是所需的时区。@非常感谢jfs花时间指出我的错误并给出更正!我应该仔细阅读文档,因为我是链接到它的。在您的帮助下,我已更新了解决方案。我相信它现在状态良好:Dtext有误导性:fromtimestamp参数seconds,因为epoch不依赖于生成其arg的本地时区。time.time返回的值与您当前所在的本地时区相同。@jfs捕捉得很好,根据您的反馈,我做了一些更新,非常感谢!关键是答案中的代码产生了一个错误的值,而不是它建议应该产生的值。运行我上面提供的示例,亲自查看DT.datetime.nowDT.timezone.utc.timestamp在某些情况下不返回POSIX timestamp。我没有仔细研究它,但我的猜测是,现在UTC与TZ=right/UTC产生不同的时间,但是。时间戳公式对于正确的时区无效。正确的时间戳计数闰秒,并使用不同的历元
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