如何用discord.py自动获取Discord服务器成员的本地消息时间?
Discord机器人时区处理解决方案
先澄清一个关键误解
message.created_at.timestamp()返回的是Unix时间戳,本质是UTC时间的秒数,不存在时区差异——你在本地机器看到的“本地时区时间”是因为本地环境将时间戳解析为本地时区显示,而Heroku直接以UTC展示,并非时间戳本身有变化。核心逻辑里要始终以UTC作为基准时间处理。
关于自动检测用户本地时间
Discord官方API不提供用户的本地时区数据,因此无法自动检测用户发送消息时的本地时间。以下是两种可行的替代方案:
1. 让用户手动设置并存储时区
- 引导用户输入标准时区标识符(如
Asia/Shanghai、America/New_York),将该标识符与用户ID绑定存储到数据库中 - 使用Python的
zoneinfo(Python 3.9+)或pytz库处理时区转换:from datetime import datetime import zoneinfo # 从数据库获取用户绑定的时区字符串 user_tz_str = "Asia/Shanghai" user_timezone = zoneinfo.ZoneInfo(user_tz_str) # 将UTC时间转换为用户本地时间 user_local_time = message.created_at.astimezone(user_timezone) - 设置提醒时,将用户指定的本地时间转换为UTC时间存储,触发提醒时再转回用户时区展示
2. 支持用户输入自然语言时间
- 使用
dateparser库解析用户输入的自然语言时间(如“明天9点”“3小时后”),该库可结合用户预设时区或自动识别时间中的时区信息:import dateparser import zoneinfo user_input = "明天早上9点提醒我" user_tz = zoneinfo.ZoneInfo("Asia/Shanghai") # 结合用户时区解析时间 parsed_local_time = dateparser.parse( user_input, settings={"TIMEZONE": str(user_tz), "RETURN_AS_TIMEZONE_AWARE": True} ) # 转换为UTC时间用于内部存储和提醒触发 utc_reminder_time = parsed_local_time.astimezone(zoneinfo.ZoneInfo("UTC"))
核心原则
- 所有内部时间存储、计算都以UTC为基准,避免时区混乱
- 仅在与用户交互时,将UTC时间转换为用户的本地时区展示
内容的提问来源于stack exchange,提问作者Arafat Khan
相关产品推荐
相关产品推荐

