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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:09:21