王麑 2025-07-22 11:15 采纳率: 98.8%
浏览 0
已采纳

问题:如何在 LeetCode 中处理 Twitter 类问题中的时间差(如小时、天)计算?

在 LeetCode 中处理类似 Twitter 的时间差计算问题(如“几小时前”、“几天前”)时,常见问题是如何将时间戳转换为友好的相对时间格式。通常输入为 Unix 时间戳,需转换为小时、天、月等单位进行判断。解决思路是:首先将当前时间和给定时间戳做差,得到秒数;再根据秒数换算成相应的单位(如 60 秒为1分钟,3600秒为1小时),并按规则输出最近的时间描述。例如: > 给定当前时间 `now` 和某条推文发布时间 `time`,设计函数输出如 "1 hour ago" 或 "2 days ago" 的描述。要求:若时间差小于1分钟,返回 "a minute ago";小于1小时,返回 "X minutes ago";依此类推。 此类问题常见于设计社交系统中的时间显示模块。
  • 写回答

1条回答 默认 最新

  • 杨良枝 2025-07-22 11:15
    关注

    一、问题背景与应用场景

    在社交网络系统中,时间的展示方式往往不是直接显示具体时间,而是以“友好时间”(Friendly Time)形式呈现,如“3分钟前”、“5小时前”、“昨天”或“2周前”等。这类问题在 LeetCode 中也有所体现,例如 LeetCode 1306. Tweet Counts Per Frequency 等题目。

    此类问题的核心在于如何将两个 Unix 时间戳的差值转换为用户友好的时间描述。

    二、问题分析与单位划分

    通常输入为两个时间戳:

    • now:当前时间戳(通常为系统当前时间)
    • time:某条推文的发布时间戳

    计算两者的时间差(单位为秒),然后根据不同的时间范围返回相应的描述。

    时间差范围(秒)输出格式
    < 60"a minute ago"
    < 3600"X minutes ago"
    < 86400"X hours ago"
    < 604800"X days ago"
    < 2592000"X weeks ago"
    < 31536000"X months ago"
    >= 31536000"X years ago"

    三、解决方案与代码实现

    我们可以将时间差按照上述区间进行判断,并返回对应的描述字符串。以下是一个 Python 实现示例:

    
    def format_tweet_time(now, time):
        diff = now - time
        if diff < 60:
            return "a minute ago"
        elif diff < 3600:
            return f"{diff // 60} minutes ago"
        elif diff < 86400:
            return f"{diff // 3600} hours ago"
        elif diff < 604800:
            return f"{diff // 86400} days ago"
        elif diff < 2592000:
            return f"{diff // 604800} weeks ago"
        elif diff < 31536000:
            return f"{diff // 2592000} months ago"
        else:
            return f"{diff // 31536000} years ago"
    
        

    该函数简洁明了,适用于大多数场景下的友好时间格式化需求。

    四、进阶思考与边界条件处理

    实际开发中还需考虑以下情况:

    • 时间差为负值(未来时间):可返回 "in X minutes"
    • 单位为单数时,应返回 "1 minute ago" 而不是 "1 minutes ago"
    • 跨月或跨年时,需考虑月份天数、闰年等复杂逻辑

    改进后的函数示例如下:

    
    def format_tweet_time_improved(now, time):
        diff = now - time
        if diff < 0:
            return "in the future"
        elif diff < 60:
            return "a minute ago"
        elif diff < 120:
            return "1 minute ago"
        elif diff < 3600:
            return f"{diff // 60} minutes ago"
        elif diff < 7200:
            return "1 hour ago"
        elif diff < 86400:
            return f"{diff // 3600} hours ago"
        elif diff < 172800:
            return "1 day ago"
        elif diff < 604800:
            return f"{diff // 86400} days ago"
        elif diff < 1209600:
            return "1 week ago"
        elif diff < 2592000:
            return f"{diff // 604800} weeks ago"
        elif diff < 31104000:
            return f"{diff // 2592000} months ago"
        elif diff < 62208000:
            return "1 year ago"
        else:
            return f"{diff // 31536000} years ago"
    
        

    该版本考虑了单复数变化和更精确的时间区间。

    五、流程图展示处理逻辑

                
                    graph TD
                        A[开始] --> B[计算时间差]
                        B --> C{时间差 < 60?}
                        C -->|是| D["a minute ago"]
                        C -->|否| E{时间差 < 3600?}
                        E -->|是| F["X minutes ago"]
                        E -->|否| G{时间差 < 86400?}
                        G -->|是| H["X hours ago"]
                        G -->|否| I{时间差 < 604800?}
                        I -->|是| J["X days ago"]
                        I -->|否| K{时间差 < 2592000?}
                        K -->|是| L["X weeks ago"]
                        K -->|否| M{时间差 < 31536000?}
                        M -->|是| N["X months ago"]
                        M -->|否| O["X years ago"]
                
            
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 7月22日