Discord机器人按用户地区显示时区、时间和日期的技术问询
实现Discord机器人根据用户时区显示时间日期的完整方案
没问题,我来帮你搞定这个需求!要让机器人根据用户所在时区展示时间日期,核心是获取用户的时区偏好,然后用Intl.DateTimeFormat针对该时区格式化时间。下面是一步步的完整实现:
核心思路
Discord API不会直接返回用户的时区信息,所以我们需要:
- 让用户手动设置自己的时区(最可靠的方式)
- 存储用户的时区偏好
- 当用户请求时间时,调用对应时区的格式化方法
完整代码实现(以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');
关键细节说明
- 时区存储:用
quick.db做轻量级存储,适合小型机器人;如果是大型项目,建议用MongoDB、PostgreSQL等数据库。 - 时区验证:通过尝试创建
Intl.DateTimeFormat实例来校验用户输入的时区是否有效,避免无效值导致程序崩溃。 - 格式化控制:通过
Intl.DateTimeFormat的参数可以灵活调整时间、日期的显示格式,比如改成12小时制只需把hour12设为true。 - 时区名称获取:用
formatToParts方法拆分格式化后的字符串,提取时区名称部分,比你之前用字符串替换的方式更可靠。
额外提示
- 用户可以通过搜索「IANA时区列表」找到所有有效的时区标识符,比如美国西部对应
America/Los_Angeles,中国对应Asia/Shanghai。 - 如果不想让用户手动设置,也可以尝试通过用户的Discord locale(
interaction.user.locale)猜测时区,但这种方式准确性不高,同一个locale可能覆盖多个时区。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

