我有两个以浮动格式存储的时间戳:
tms1 = 1479081600.0
tms2 = 1482105600.0
计算差异后我得到了
tms2 - tms1
3024000.0
如何在数天,数月或数年内将此时差3024000显示为可读格式?(答案为2016年11月14日至2016年12月19日期间使用在线unix的35天时差计算器)
答案 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