我试图用Python计算两个日期之间的差异,并用天、周、月和年来表示这个时间差。
我的Python代码如下:
purDate = datetime.datetime.strptime(queryPurchaseDate (purID), "%Y-%m-%d %H:%M:%S")
now = datetime.datetime.now()
print 'Purchase date/time : ',purDate.strftime("%Y-%m-%d %H:%M:%S")
print 'Current date/time : ',now.strftime("%Y-%m-%d %H:%M:%S")
hold = now - purDate
print hold
Run Code Online (Sandbox Code Playgroud)
这段代码的结果如下:
bash-3.2$ ./test.py
Purchase date/time : 2017-10-10 00:00:00
Current date/time : 2017-10-14 17:33:39
4 days, 17:33:39.866069
bash-3.2$
Run Code Online (Sandbox Code Playgroud)
我不想将两个日期之间的差异表示为 4 天,17:33:39.866069 我希望将其表示为如下:4.65 天,或 0.66 周,或 0.15 个月,或 0.01 年
两个对象之间的差异datetime是一个timedelta对象。您可以用秒来表示该差异,然后使用一天/周/月/年中总秒数的定义来获得您的比率。
>>> diff = timedelta(days=4, seconds=17 * 3600 + 33 * 60 + 39.866069)
>>> print(diff)
4 days, 17:33:39.866069
>>> diff.total_seconds() / 86400
4.731711412835648
>>> diff.total_seconds() / (86400 * 7)
0.6759587732622354
>>> diff.total_seconds() / (86400 * 30)
0.15772371376118827
>>> diff.total_seconds() / (86400 * 365)
0.012963592911878487
Run Code Online (Sandbox Code Playgroud)
这种方法有点简单化,因为它没有考虑月份或闰年的不规则性。365 天和 366 天之间的差异不应显示在您想要的准确度范围内,因此您可以忽略它。对于月份,您是否希望 30 天始终为一个月,或者您希望将 01-08-2017 到 01-09-2017 注册为一个月?这会使事情变得复杂,最多可提高 0.01 的准确度。
def timedelta_to(time_diff, unit='day'):
options = {'day': 86400,
'week': 86400 * 7,
'month': 86400 * 30,
'year': 86400 * 365,
}
# default to days for an invalid unit of choice,
# though warning to user might be another option
if unit not in options:
unit = 'day'
duration = time_diff.total_seconds() / options[unit]
return '{0:.2f} {1}s'.format(duration, unit.title())
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用它。
>>> timedelta_to(diff)
'4.73 Days'
>>> timedelta_to(diff, 'month')
'0.16 Months'
Run Code Online (Sandbox Code Playgroud)