我正在尝试为“输入秒数”编写一个python脚本,并以周,天,小时,分钟和秒为单位获得结果。这是我的,但我没有得到正确的答案。我做错了什么?
seconds = raw_input("Enter the number of seconds:")
seconds = int(seconds)
minutes = seconds/60
seconds = seconds % 60
hours = minutes/60
hours = seconds/3600
minutes = minutes % 60
days = hours/24
days= minutes/1440
days = seconds/86400
hours = hours % 60
hours = minutes % 60
hours = seconds % 3600
weeks = days/7
weeks = hours/168
weeks = minutes/10080
weeks = seconds/604800
days = days % 1
days = hours % 24
days = minutes % 1440
days = seconds % 86400
weeks = weeks % 1
weeks = days % 7
weeks = hours % 168
weeks = minutes % 10080
weeks = seconds % 604800
print weeks, 'weeks', days, 'days', hours, 'hours', minutes, 'minutes', seconds, 'seconds'
答案 0 :(得分:9)
仅从基本转换原则:
weeks = seconds / (7*24*60*60)
days = seconds / (24*60*60) - 7*weeks
hours = seconds / (60*60) - 7*24*weeks - 24*days
minutes = seconds / 60 - 7*24*60*weeks - 24*60*days - 60*hours
seconds = seconds - 7*24*60*60*weeks - 24*60*60*days - 60*60*hours - 60*minutes
做同样事情的一点点吵闹的方式:
weeks = seconds / (7*24*60*60)
seconds -= weeks*7*24*60*60
days = seconds / (24*60*60)
seconds -= days*24*60*60
hours = seconds / (60*60)
seconds -= hours*60*60
minutes = seconds / 60
seconds -= minutes *60
同样具有divmod
函数的更清晰版本,它在元组(division, remainder)
中返回除法结果和余数:
weeks, seconds = divmod(seconds, 7*24*60*60)
days, seconds = divmod(seconds, 24*60*60)
hours, seconds = divmod(seconds, 60*60)
minutes, seconds = divmod(seconds, 60)
基本上,此解决方案最接近您的尝试,因为这是divmod
所做的:
weeks, seconds = divmod(seconds, 7*24*60*60)
相当于
weeks = seconds / (7*24*60*60)
seconds = seconds % (7*24*60*60)
在这里,我们基本上可以找到我们这个星期的整周数,并保留这几周后剩下的数量。
而且你也可以从另一端走,使它更漂亮:
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)
days, hours = divmod(hours, 24)
weeks, days = divmod(days, 7)
这背后的想法是你的答案中的秒数是以分钟为单位除以后的余数;分钟是将所有分钟分成小时等的剩余时间......此版本更好,因为您可以轻松地将其调整为数月,数年等...
答案 1 :(得分:0)
使用python datetime timedeltas支持毫秒或微秒。
import datetime
def convert(sec):
td = datetime.timedelta(seconds=sec, microseconds=sec-int(sec))
return td.days/7, (td.days/7)%7, td.seconds/3600, (td.seconds/60)%60, td.seconds%60, td.microseconds, td.microseconds/1000
seconds = 8*24*60*60+21627.123 # 8 days, 6 hours (21600 seconds), 27.123 seconds
w,d,h,m,s,us,ms = convert(seconds)
print '{}s / {}w {}d {}h {}m {}s {}us {}ms'.format(seconds,w,d,h,m,s,us,ms)
712827.123s / 1w 1d 6h 0m 27s 123000us 123ms
答案 2 :(得分:-1)
def humanize_duration(amount, units='s'):
INTERVALS = [(lambda mlsec:divmod(mlsec, 1000), 'ms'),
(lambda seconds:divmod(seconds, 60), 's'),
(lambda minutes:divmod(minutes, 60), 'm'),
(lambda hours:divmod(hours, 24), 'h'),
(lambda days:divmod(days, 7), 'D'),
(lambda weeks:divmod(weeks, 4), 'W'),
(lambda years:divmod(years, 12), 'M'),
(lambda decades:divmod(decades, 10), 'Y')]
for index_start, (interval, unit) in enumerate(INTERVALS):
if unit == units:
break
amount_abrev = []
last_index = 0
amount_temp = amount
for index, (formula, abrev) in enumerate(INTERVALS[index_start: len(INTERVALS)]):
divmod_result = formula(amount_temp)
amount_temp = divmod_result[0]
amount_abrev.append((divmod_result[1], abrev))
if divmod_result[1] > 0:
last_index = index
amount_abrev_partial = amount_abrev[0: last_index + 1]
amount_abrev_partial.reverse()
final_string = ''
for amount, abrev in amount_abrev_partial:
final_string += str(amount) + abrev + ' '
return final_string