在NodeJS或MomentJS中从日期对象获取时区信息
问题解答
核心结论
仅通过字符串"11:10 PM"创建的日期对象,无法直接获取到Asia/Kolkata这类格式的时区信息——因为原字符串只包含时间,没有任何时区标识,创建日期对象时会默认使用运行环境的本地时区或UTC,对象本身不会存储具体的时区ID(比如Asia/Kolkata)。
Node.js 原生实现方案
Node.js的原生Date对象本身不支持直接获取或设置IANA时区(如Asia/Kolkata),但可以通过以下方式处理:
- 明确指定时区解析时间:如果知道该时间属于Asia/Kolkata时区,可手动将时间与时区结合,利用
Intl.DateTimeFormat来解析或格式化:
const timeStr = "11:10 PM"; // 拼接完整日期(Date需要时间上下文) const fullTimeStr = `2024-01-01 ${timeStr}`; // 指定Asia/Kolkata时区格式化 const options = { timeZone: 'Asia/Kolkata', hour12: true, hour: '2-digit', minute: '2-digit' }; const kolkataTime = new Intl.DateTimeFormat('en-US', options).format(new Date(fullTimeStr)); // 通过偏移量间接判断时区(Asia/Kolkata与UTC的偏移为-330分钟) const offset = new Date().getTimezoneOffset();
- 注意:原生
Date本质存储UTC时间戳,没有时区ID概念,偏移量可能对应多个时区,无法精准定位到Asia/Kolkata。
MomentJS + Moment-Timezone 实现方案
MomentJS本身不处理时区,需配合moment-timezone插件支持IANA时区:
- 安装依赖:
npm install moment moment-timezone
- 指定时区解析时间:若已知"11:10 PM"属于Asia/Kolkata时区,可手动指定时区创建moment对象:
const moment = require('moment-timezone'); const timeStr = "11:10 PM"; // 拼接日期并指定Asia/Kolkata时区解析 const kolkataMoment = moment.tz(`2024-01-01 ${timeStr}`, 'YYYY-MM-DD hh:mm A', 'Asia/Kolkata'); // 获取时区ID const timeZoneId = kolkataMoment.tz(); // 返回 "Asia/Kolkata"
- 关键说明:如果未提前指定时区,moment默认使用本地时区,此时无法从无时区标识的时间字符串中自动推断出Asia/Kolkata——时区信息必须预先明确,无法从纯时间字符串中提取。
内容的提问来源于stack exchange,提问作者Sounak Saha
相关产品推荐
相关产品推荐

