You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

秒数转时间分量时,如何实现英文规范的混合分隔格式?

问题解决:秒数转换为规范时间表述

问题描述

我正在完成一项编程练习,要求输入秒数后返回转换后的年、天、小时、分钟、秒的时间表述。规则是各分量用", "分隔,最后一个分量用" and "连接(符合英文书写规范)。但当前代码只能统一用" and "连接所有分量(比如生成“2 days and 4 hours and 56 minutes and 4 seconds”),尝试用计数器统计逗号和and的数量却没法正确添加到对应位置,求解决方案。

原代码如下:

def format_duration(seconds):
    result = []
    counter = 0
    if seconds == 0:
        print('now')
        return 'now'
    final_years = int(seconds/31536000)
    final_days = (int(seconds/86400))%365
    final_hours = (int(seconds/3600))%24
    final_minutes = (int(seconds/60))%60
    final_seconds = seconds%60
    returning(final_years,' year',result)
    returning(final_days,' day',result)
    returning(final_hours,' hour',result)
    returning(final_minutes,' minute',result)
    returning(final_seconds,' second',result)
    print(' and '.join(result))
    return ' and '.join(result)

def returning(time,name,array):
    if time > 0:
        if time == 1:
            array.append(str(time)+name)           
        if time > 1:
            name += 's'
            array.append(str(time)+name)

format_duration(190564)

解决方案

核心是根据结果列表的长度动态处理连接逻辑,不需要额外计数器,直接通过列表切片实现:

修改后的完整代码:

def format_duration(seconds):
    result = []
    if seconds == 0:
        print('now')
        return 'now'
    final_years = int(seconds/31536000)
    final_days = (int(seconds/86400))%365
    final_hours = (int(seconds/3600))%24
    final_minutes = (int(seconds/60))%60
    final_seconds = seconds%60
    returning(final_years,' year',result)
    returning(final_days,' day',result)
    returning(final_hours,' hour',result)
    returning(final_minutes,' minute',result)
    returning(final_seconds,' second',result)
    
    # 动态处理连接逻辑
    if len(result) == 1:
        output = result[0]
    else:
        # 前n-1个用逗号连接,最后一个用and连接
        output = ', '.join(result[:-1]) + ' and ' + result[-1]
    
    print(output)
    return output

def returning(time,name,array):
    if time > 0:
        if time == 1:
            array.append(str(time)+name)           
        elif time > 1:  # 改成elif避免逻辑冗余
            name += 's'
            array.append(str(time)+name)

format_duration(190564)

关键修改说明

  1. 移除无用变量:删掉了没用到的counter变量
  2. 结果拼接逻辑优化:
    • 当结果列表只有1个元素时,直接返回该元素
    • 当列表有多个元素时,用, 连接前n-1个元素,再和最后一个元素用and拼接,完全符合英文书写规范
  3. 小细节优化:把returning函数里的第二个if改成elif,避免时间等于1时多余的判断,逻辑更严谨

测试format_duration(190564)会输出:2 days, 4 hours, 56 minutes and 4 seconds,符合要求。

内容的提问来源于stack exchange,提问作者damoN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:13:32