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

时间:2017-08-26 21:04:07

标签: python algorithm datetime date-arithmetic python-datetime

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

tms1 = 1479081600.0
tms2 = 1482105600.0

计算差异后我得到了

tms2 - tms1
3024000.0

如何在数天,数月或数年内将此时差3024000显示为可读格式?(答案为2016年11月14日至2016年12月19日期间使用在线unix的35天时差计算器)

2 个答案:

答案 0 :(得分:4)

您可以使用(在import 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天。它也无法处理时区。如果您需要其中任何一项,请参阅the legendary Raymond's awesome answer

答案 1 :(得分:1)

只是减去秒数并不能帮助您了解是否已经越过了日边界,因此在计算日期之前,有必要将时间戳转换为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