如何正确收集用户参数生成Unix时间戳?解决返回NaN问题
问题原因
你的代码中new Date(dateString)返回无效日期,导致getTime()返回NaN,核心原因是JavaScript原生Date构造函数不支持US/Hawaii这种IANA时区标识符。它仅能识别有限的时区格式,比如UTC、GMT或具体偏移量(如GMT-1000),无法解析像US/Hawaii这样的时区名称。
解决方案
方案1:使用第三方时区处理库(推荐)
原生JS处理IANA时区的能力有限,最可靠的方式是使用专门的日期库,比如luxon或moment-timezone。以luxon为例:
- 安装依赖:
npm install luxon
- 修改时间解析逻辑:
const { DateTime } = require('luxon'); // 保留之前的变量获取代码 // 用luxon解析带IANA时区的日期 const date = DateTime.fromFormat( `${month} ${day}, ${year} ${time}`, 'MMMM d, yyyy HH:mm', { zone: timezone } ); // 生成秒级Unix时间戳 const timestamp = date.toUnixInteger(); console.log(`timestamp: ${timestamp}`); // 后续更新频道主题的代码不变
方案2:原生JS手动映射时区偏移
如果不想引入第三方库,可以手动维护时区到UTC偏移量的映射表,将输入时区转换为Date能识别的格式:
// 维护时区与UTC偏移量的映射(单位:分钟) const timezoneOffsetMap = { 'US/Hawaii': -10 * 60, // 夏威夷时区为UTC-10 // 可根据需求添加其他时区 }; // 保留之前的变量获取代码 // 将月份名称转换为数字(0-11,Date构造函数要求) const monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; const monthIndex = monthNames.indexOf(month); if (monthIndex === -1) { await interaction.reply('无效的月份名称!'); return; } // 拆分时间为小时和分钟 const [hours, minutes] = time.split(':').map(Number); // 获取时区偏移量 const offsetMinutes = timezoneOffsetMap[timezone]; if (typeof offsetMinutes === 'undefined') { await interaction.reply('不支持的时区!'); return; } // 计算UTC时间并转换为秒级时间戳 const utcTimestamp = Date.UTC(year, monthIndex, day, hours, minutes) - offsetMinutes * 60 * 1000; const timestamp = utcTimestamp / 1000; console.log(`timestamp: ${timestamp}`); // 后续更新频道主题的代码不变
额外注意
你原来的dateString格式存在小问题,正确的带逗号格式应为March 5, 2023 15:00,但即使修正格式,原生Date依然无法解析US/Hawaii时区,所以核心问题还是时区处理逻辑。
内容的提问来源于stack exchange,提问作者Randy Bailey
相关产品推荐
相关产品推荐

