从纪元到相对日期的秒数

Posted

技术标签:

【中文标题】从纪元到相对日期的秒数【英文标题】:Seconds since epoch to relative date 【发布时间】:2011-06-09 07:09:34 【问题描述】:

我正在处理自纪元以来的日期,并且已经得到了,例如:

date = 6928727.56235

我想把它转换成另一种相对格式,这样我就可以把它转换成相对于时代的东西。

使用 time.gmtime(date),它返回

year=1970, mon=3, day=22, hour=4, min=38, sec=47

我认为纪元从 '01/01/1970 00:00:00' 开始,所以该方法应该以如下方式返回相对日期:

'2 months 21 days 04:38:47'

有什么帮助吗?

【问题讨论】:

22-March 04:38 不是 01-January 00:00 之后的 2 个月 22 天 04:38。 不,其实是2个月21天04:38:47... 【参考方案1】:

该方法应该返回相对的 日期如下: '2 个月 22 天 04:38:47'

您不能这样做,因为一个月的长度介于 28 到 31 天之间。 “2 个月零 22 天”这句话可能意味着 81 到 84 天之间的任何时间。 (或者在 78 到 84 天之间,如果月份不必是连续的)。

所以你想要的只是荒谬的。相对日期时间只能以天、小时和秒为单位计算,直到差异变得如此之大以至于天数不再重要,在这种情况下,您可以开始以月或年为单位计算(但您不能包括天数)不再)。

所以你可以说“五年零两个月”,或者“八十天零三个小时”,或者“两百年”。但你不能说“两个月零三天”或“五年零二十天”。这些陈述根本没有意义。

因此,正确答案确实是eumiros

timedelta(seconds=6928727.56235)

但现在你也知道为什么了。

(当然,除非你所说的月份实际上是指月亮周期,确实有固定的长度。:))

【讨论】:

感谢您的解释,我会考虑使用它而不是其他语法('两个月......')。你说的有道理。感谢您的添加。 @GabrielL.Oliveira:一般来说,a day is not 86400 (SI?) seconds 除非我们谈论的是与 UTC 不同的 POSIX 时间(正如您的问题所暗示的那样)。因此,“天 + 秒 + 微秒”与“月 + 天”一样有意义,即,如果您可以忽略(在您的特定情况下)86400 和 86401(百万微秒)或 28 和 31(三个天)相应地。 如果已知(按照惯例)表示两个特定日期之间的差异(实际上可以是 81 到 84 天之间的任何日期),您可以说“两个月零三天”,例如所需日期和纪元开始之间的差异。【参考方案2】:
from datetime import timedelta

a = timedelta(seconds=6928727.56235)

# a is now datetime.timedelta(80, 16727, 562350)

print "%d days %02d:%02d:%02d" % (a.days, a.seconds / 3600, (a.seconds / 60) % 60, a.seconds % 60)

返回80 days 04:38:47,这是正确的,但不是 OP 想要的(80 天而不是 2 个月 21 天)。

【讨论】:

谢谢。这个解决方案对我来说已经足够了。【参考方案3】:

time.gmtime 返回一个 ParseTuple 对象,您可以使用元组的各个元素进行计算。像这样的

>>> time_epoch = time.gmtime(0)
>>> time_at_hand = time.gmtime(6928727.56235)
>>> print "It's been %d days somewhat like  %d months, %d days and %d hours, %d  minutes, %d seconds " % (time_at_hand.tm_yday - time_epoch.tm_yday, time_at_hand.tm_mon - time_epoch.tm_mon , time_at_hand.tm_mday - time_epoch.tm_mday, time_at_hand.tm_hour - time_epoch.tm_hour, time_at_hand.tm_min - time_epoch.tm_min, time_at_hand.tm_sec - time_epoch.tm_sec)
It's been 80 days somewhat like  2 months, 21 days and 4 hours, 38  minutes, 47 seconds 

【讨论】:

【参考方案4】:

类似于 Eumiro 的答案,但不需要除以 60 等 - 而是使用 Pandas Timestamp 并从纪元开始获取差异。

date = 6928727.56235
import pandas as pd
pd.Timestamp(datetime.fromtimestamp(date))-pd.Timestamp(datetime.fromtimestamp(0))

返回

Timedelta('80 days 04:38:47.562350')

【讨论】:

以上是关于从纪元到相对日期的秒数的主要内容,如果未能解决你的问题,请参考以下文章

在linux bash中将ISO日期转换为纪元以来的秒数

自上一个纪元以来的秒数的 T-Sql 日期格式/sqlite 输入的格式

在比较 jwt.iat(发布于)属性与当前日期时间时遇到问题 - (“自纪元以来的秒数”NumericDate)

获取 C 中特定日期的纪元秒数

获取从日期到月底 PHP 的秒数

使用 strftime 将 python 日期时间转换为纪元