将两个时间戳浮点数转换为可读的年数、月数和天数

Convert two timestamp floats to a readable number of years, months, and days

我有两个以浮点格式存储的时间戳:

tms1 = 1479081600.0
tms2 = 1482105600.0

计算差值后我得到

tms2 - tms1
3024000.0

如何将这个 3024000 的时差显示为以天、月或年为单位的可读格式?(答案是从 2016 年 11 月 14 日到 12 月 19 日之间的 35 天2016 使用在线 unix 时差计算器)

您可以使用(在 importing datetime 之后)

datetime.timedelta(seconds=3024000).days

35

您应该使用 timedelta,因为这是时间增量 - 时间差,而不是绝对时间。也可以通过将 timedelta 强制转换为字符串来获得完整表示:

print(datetime.timedelta(seconds=3024000))

给出输出:

35 days, 0:00:00

请注意,您不需要任何在线计算器 - datetime 随附电池。你可以这样做:

import datetime

date_format = "%d %b %Y"

start_date = datetime.datetime.strptime("14 Nov 2016", date_format)
end_date = datetime.datetime.strptime("19 Dec 2016", date_format)

print(start_date == datetime.datetime.fromtimestamp(1479081600))

print(start_date)
print(end_date.strftime("%d/%m/%Y"))

diff = end_date - start_date

print(diff)
print(diff.days)

输出:

True
2016-11-14 00:00:00
19/12/2016
35 days, 0:00:00
35

请注意,此处的 diff 与原始 timedelta 对象相同,但它是从 datetime 动态创建的,而不是静态构造的。我还演示了您可以根据时间戳构建日期时间这一事实,如果您愿意的话,我还冒昧地演示了 strftime 等来说明日期时间的强大功能。我强烈推荐 datetime 方法而不是算术方法,因为它更具可读性和可扩展性。

这个答案非常轻量级,不一定是坏的,因为通常你可能不需要比它提供的更多的功能,但如果 timedelta 两天之间的时间少于 24 小时,它会例如,向下舍入到 0 天。它也无法处理时区。如果您需要其中任何一个,请参阅

仅仅减去秒并不能帮助您知道是否超过了日期边界,因此在计算日期之前有必要将时间戳转换为 datetime 对象。

添加,因为时区会影响 UTC 时间戳的日历日,您可能还需要一个 tzinfo 对象。

知道日历日期后,需要一些日历数学来计算年、月和日的差异:

from datetime import timedelta, datetime

def time_diff(start_timestamp, end_timestamp, tz=None):
    """ Return time difference in years, months, and days.

        If *tz* is None, the timestamp is converted to the platform’s local date 
        and time.  Otherwise, *tz* should be an instance of a *tzinfo* subclass.
    """

    # Determine whether we're going forward or backward in time
    ago = ''
    if end_timestamp < start_timestamp:
        ago = 'ago'
        start_timestamp, end_timestamp = end_timestamp, start_timestamp

    # Compute the calendar dates from the timestamps
    d1  = datetime.fromtimestamp(start_timestamp, tz)
    d2  = datetime.fromtimestamp(end_timestamp, tz)

    # Advance d1 day-by-day until the day is at or above d2.day
    days = 0
    while d2.day < d1.day:
        days += 1
        d1 += timedelta(days=1)

    # Now compute the day difference
    days += d2.day - d1.day

    # Compute the totals months difference and express in years and months
    total_months = (d2.year * 12 + d2.month) - (d1.year * 12 + d1.month)
    years, months = divmod(total_months, 12)

    # format the output
    plural = lambda n: '' if n == 1 else 's'
    return '%d year%s, %d month%s, and %d day%s %s' % (
        years, plural(years), months, plural(months), days, plural(days), ago)

以下是如何使用该函数的示例:

from datetime import tzinfo

class GMT1(tzinfo):
    # Example tzinfo subclass taken from the Python docs
    def utcoffset(self, dt):
        return timedelta(hours=1)
    def dst(self, dt):
        return timedelta(0)
    def tzname(self,dt):
        return "Europe/Prague"

print(time_diff(1479081600.0, 1482105600.0, tz=GMT1()))

这输出:

0 years, 1 month, and 5 days