在 Python 中将秒转换为天、小时、分钟和秒 [关闭]

Posted

技术标签:

【中文标题】在 Python 中将秒转换为天、小时、分钟和秒 [关闭]【英文标题】:Converting seconds into days, hours, minutes & seconds in Python [closed] 【发布时间】:2021-12-10 02:09:56 【问题描述】:

我有一个函数可以将秒返回天、小时、分钟和秒。但我需要但是,如果输出为 0,则不打印。例如,如果我输入 176400 秒,我希望输出为“2 天 1 小时”而不是“2 天、2 小时、0 分钟、0 秒”。

到目前为止我做到了:

sec = int(input("Enter time in Seconds: "))
temp = sec
day = sec // 86400
sec %= 86400
hour = sec // 3600
sec %= 3600
mins = sec // 60
sec %= 60

if day >= 1:
    print(f'time in minutes is daydays hourhour minsmin secsec')

elif hour >= 1:
    if mins == 0 and sec == 0:
        print(f'time in minutes is hourhour')
    elif mins == 0:
        print(f'time in minutes is hourhour secsec')
    elif sec == 0:
        print(f'time in minutes is hourhour minsmin')
    else:
        print(f'time in minutes is hourhour minsmin secsec')

elif mins >= 1:
    if sec == 0:
        print(f'time in minutes is minsmin')
    else:
        print(f'time in minutes is minsmin secsec')

elif sec >= 1:
    print(f'time sec == sec sec')

我可以继续这段代码使用一堆“if”语句,但有更短的方法吗?

【问题讨论】:

试着更清楚地思考你的预期逻辑。你可能会发现拿一支真正的铅笔和一张纸,然后画一个流程图很有帮助。也就是说,关于以更短或更“更优雅”的方式做事的问题通常不在此处讨论。如果代码已经正常工作,您可能想尝试codereview.stackexchange.com。 题外话,但您可以使用divmod() 来简化数学运算,例如day, sec = divmod(sec, 86400) 【参考方案1】:

您似乎正在尝试执行以下操作:

result = "time in minutes is"
if days >0:
    result += f" days days"
if hours > 0:
    result += f" hours hours"
if mins > 0:
    result += f" mins minutes"
if secs > 0:
    result += f" secs seconds"

【讨论】:

【参考方案2】:

IIUC,你想要更短的方式,然后你可以使用datetime.timedelta,如下所示:

import datetime

sec = int(input('Enter the number of seconds: '))

print(datetime.timedelta(seconds=sec))

输出:

Enter the number of seconds: 86600
1 day, 0:03:20

你可以添加这些行来得到你想要的:

import datetime
sec = int(input('Enter the number of seconds: '))
str_tm = str(datetime.timedelta(seconds=sec))
day = str_tm.split(',')[0]
hour, minute, second = str_tm.split(',')[1].split(':')
print(f'dayhour hour minute min second sec')

输出:

Enter the number of seconds: 176400
2 days 1 hour 00 min 00 sec

【讨论】:

【参考方案3】:

您可以将非零部分组装在一个列表中并在最后加入。您还可以使用 divmod 函数来提取天、小时、分钟和秒:

sec = int(input("Enter time in Seconds: "))

time  = []
days,sec = divmod(sec,86400) # sec will get seconds in partial day
if days:
    time.append(f"days day"+"s"*(days>1))
    
hours,sec = divmod(sec,3600) # sec will get seconds in partial hour
if hours:
    time.append(f"hours hour"+"s"*(hours>1))
    
minutes,sec = divmod(sec,60) # sec will get seconds in partial minute
if minutes:
    time.append(f"minutes minute"+"s"*(minutes>1))
    
if sec:
    time.append(f"sec second"+"s"*(sec>1))

示例运行:

Enter time in Seconds: 176400
time is: 2 days, 1 hour

Enter time in Seconds: 1767671
time is: 20 days, 11 hours, 1 minute, 11 seconds

Enter time in Seconds: 259321
time is: 3 days, 2 minutes, 1 second

整个事情可以使用一个遍历除数和时间单位的循环来简化:

sec = int(input("Enter time in Seconds: "))

time  = []
for d,u in [(86400,"day"),(3600,"hour"),(60,"minute"),(1,"second")]:
    n,sec = divmod(sec,d)
    if n: time.append(f"n u"+"s"*(n>1))
    
print("time is:",", ".join(time))

就个人而言,我更喜欢使用更熟悉的值(例如一小时 60 分钟),这会稍微改变顺序。此外,时间字符串可以直接组装,而不是使用列表并在末尾加入:

sec = int(input("Enter time in Seconds: "))

time  = ""
for d,u in [(60,"second"),(60,"minute"),(24,"hour"),(sec,"day")]:
    sec,n = divmod(sec,d)
    if n: time = f"n u" + "s"*(n>1) + ", "*bool(time) + time
    
print("time is:",time)

【讨论】:

以上是关于在 Python 中将秒转换为天、小时、分钟和秒 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将天、小时、分钟和秒转换为整数

如何将秒转换为小时、分钟和秒?

在 ZonedDateTime 或 Instant 中将小时分钟和秒设置为 00

如何在 SQL 中将小时、分钟和秒 (HH:mm:ss) 转换为分钟和秒 (mm:ss)

使用 Duration 对象在 Java 中将天、分钟、小时转换为秒失败

将秒转换为天、小时、分钟、秒 (MySQL)