将两个时间戳浮点数转换为可读的年数、月数和天数
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 时差计算器)
您可以使用(在 import
ing 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
我有两个以浮点格式存储的时间戳:
tms1 = 1479081600.0
tms2 = 1482105600.0
计算差值后我得到
tms2 - tms1
3024000.0
如何将这个 3024000 的时差显示为以天、月或年为单位的可读格式?(答案是从 2016 年 11 月 14 日到 12 月 19 日之间的 35 天2016 使用在线 unix 时差计算器)
您可以使用(在 import
ing 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