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

Discord机器人按用户地区显示时区、时间和日期的技术问询

实现Discord机器人根据用户时区显示时间日期的完整方案

没问题,我来帮你搞定这个需求!要让机器人根据用户所在时区展示时间日期,核心是获取用户的时区偏好,然后用Intl.DateTimeFormat针对该时区格式化时间。下面是一步步的完整实现:

核心思路

Discord API不会直接返回用户的时区信息,所以我们需要:

  1. 让用户手动设置自己的时区(最可靠的方式)
  2. 存储用户的时区偏好
  3. 当用户请求时间时,调用对应时区的格式化方法

完整代码实现(以Discord.js v14为例)

首先安装必要依赖:

npm install discord.js quick.db

然后编写机器人代码:

const { Client, GatewayIntentBits, SlashCommandBuilder } = require('discord.js');
const { QuickDB } = require('quick.db');
const db = new QuickDB();

// 初始化机器人,需要开启必要的意图
const client = new Client({ 
  intents: [
    GatewayIntentBits.Guilds, 
    GatewayIntentBits.GuildMessages, 
    GatewayIntentBits.MessageContent
  ] 
});

// 处理交互命令
client.on('interactionCreate', async interaction => {
  if (!interaction.isChatInputCommand()) return;

  // 设置时区的命令
  if (interaction.commandName === 'set-timezone') {
    const timezone = interaction.options.getString('timezone');
    
    // 验证输入的时区是否有效
    try {
      new Intl.DateTimeFormat(undefined, { timeZone: timezone });
    } catch (err) {
      return interaction.reply('⚠️ 无效的时区!请使用标准IANA时区标识符,比如`America/Los_Angeles`或`Asia/Shanghai`。');
    }

    // 存储用户的时区到数据库
    await db.set(`user_${interaction.user.id}_timezone`, timezone);
    return interaction.reply(`✅ 你的时区已设置为:\`${timezone}\``);
  }

  // 查询当前时间的命令
  if (interaction.commandName === 'current-time') {
    // 获取用户时区:优先用用户设置的,没有则用机器人默认时区
    const userTimezone = await db.get(`user_${interaction.user.id}_timezone`) 
      || Intl.DateTimeFormat().resolvedOptions().timeZone;

    const now = new Date();

    // 格式化时间(24小时制)
    const formattedTime = new Intl.DateTimeFormat('en-US', {
      timeZone: userTimezone,
      hour12: false,
      hour: '2-digit',
      minute: '2-digit',
      second: '2-digit'
    }).format(now);

    // 格式化日期(YYYY-MM-DD格式)
    const formattedDate = new Intl.DateTimeFormat('en-US', {
      timeZone: userTimezone,
      year: 'numeric',
      month: '2-digit',
      day: '2-digit'
    }).format(now);

    // 获取友好的时区名称(比如Pacific Daylight Time)
    const timezoneName = new Intl.DateTimeFormat('en-US', {
      timeZone: userTimezone,
      timeZoneName: 'long'
    }).formatToParts(now)
      .find(part => part.type === 'timeZoneName')
      .value;

    // 构造回复内容
    const replyMsg = `**Zone** - \`${timezoneName}\` **Time** - \`${formattedTime}\` **Date** - \`${formattedDate}\``;
    await interaction.reply(replyMsg);
  }
});

// 注册Slash命令(机器人启动时执行一次即可)
client.on('ready', async () => {
  const commands = [
    new SlashCommandBuilder()
      .setName('set-timezone')
      .setDescription('设置你的时区,用于显示对应时间')
      .addStringOption(option =>
        option.setName('timezone')
          .setDescription('标准IANA时区,比如America/Los_Angeles')
          .setRequired(true)),
    new SlashCommandBuilder()
      .setName('current-time')
      .setDescription('查看你所在时区的当前时间和日期')
  ];

  await client.application.commands.set(commands);
  console.log(`🤖 机器人已登录:${client.user.tag}`);
});

// 启动机器人,替换成你的Token
client.login('你的Discord机器人Token');

关键细节说明

  1. 时区存储:用quick.db做轻量级存储,适合小型机器人;如果是大型项目,建议用MongoDB、PostgreSQL等数据库。
  2. 时区验证:通过尝试创建Intl.DateTimeFormat实例来校验用户输入的时区是否有效,避免无效值导致程序崩溃。
  3. 格式化控制:通过Intl.DateTimeFormat的参数可以灵活调整时间、日期的显示格式,比如改成12小时制只需把hour12设为true。
  4. 时区名称获取:用formatToParts方法拆分格式化后的字符串,提取时区名称部分,比你之前用字符串替换的方式更可靠。

额外提示

  • 用户可以通过搜索「IANA时区列表」找到所有有效的时区标识符,比如美国西部对应America/Los_Angeles,中国对应Asia/Shanghai。
  • 如果不想让用户手动设置,也可以尝试通过用户的Discord locale(interaction.user.locale)猜测时区,但这种方式准确性不高,同一个locale可能覆盖多个时区。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:26:32