在 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"]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报