从纪元到相对日期的秒数
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')
【讨论】:
以上是关于从纪元到相对日期的秒数的主要内容,如果未能解决你的问题,请参考以下文章
自上一个纪元以来的秒数的 T-Sql 日期格式/sqlite 输入的格式