如何通过JavaScript获取指定时区的当前UTC偏移量?
获取指定IANA时区的UTC偏移量(原生JS + Day.js方案)
原生JavaScript实现
原生JS可以通过Intl.DateTimeFormat API结合Date对象计算目标时区的当前UTC偏移量,以下两种方法都能得到你需要的分钟级结果(比如-420、-240):
方法一:解析时区偏移字符串
直接提取时区的偏移标识并计算总分钟数:
function getUtcOffsetMinutes(timeZone) { const now = new Date(); // 格式化时指定要获取时区偏移的短格式(如GMT-0700) const formatter = new Intl.DateTimeFormat('en-US', { timeZone, timeZoneName: 'shortOffset' }); // 提取时区偏移部分 const offsetStr = formatter.formatToParts(now).find(p => p.type === 'timeZoneName').value; // 解析偏移的符号、小时和分钟 const sign = offsetStr.startsWith('GMT+') ? 1 : -1; const hours = parseInt(offsetStr.slice(3, 5), 10); const minutes = parseInt(offsetStr.slice(5, 7), 10); // 转换为总分钟数,结果为「本地时间 - UTC时间」的差值 return sign * (hours * 60 + minutes); } // 测试示例 console.log(getUtcOffsetMinutes('America/Los_Angeles')); // 夏令时输出-420,冬令时输出-480 console.log(getUtcOffsetMinutes('America/New_York')); // 夏令时输出-240,冬令时输出-300
方法二:利用getTimezoneOffset取反
注意:Date.prototype.getTimezoneOffset()返回的是UTC时间 - 本地时间的分钟数,因此取反后才能得到你需要的「本地时间 - UTC时间」偏移量:
function getUtcOffsetMinutes(timeZone) { const now = new Date(); // 格式化目标时区的当前时间为ISO格式字符串 const formatter = new Intl.DateTimeFormat('en-US', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }); const parts = formatter.formatToParts(now); const localIsoStr = `${parts.find(p => p.type === 'year').value}-${parts.find(p => p.type === 'month').value}-${parts.find(p => p.type === 'day').value}T${parts.find(p => p.type === 'hour').value}:${parts.find(p => p.type === 'minute').value}:${parts.find(p => p.type === 'second').value}`; // 创建对应时区的本地时间对象,计算偏移 const localDate = new Date(localIsoStr); return -localDate.getTimezoneOffset(); } // 测试 console.log(getUtcOffsetMinutes('America/Los_Angeles')); // 符合预期的偏移值
Day.js实现(更简洁)
如果使用Day.js,需要配合utc和timezone插件:
- 引入依赖:
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/utc.js"></script> <script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/timezone.js"></script>
- 核心代码:
dayjs.extend(window.dayjs_plugin_utc); dayjs.extend(window.dayjs_plugin_timezone); function getUtcOffsetMinutes(timeZone) { // dayjs.tz()创建对应时区的时间对象,utcOffset()直接返回分钟级偏移 return dayjs.tz(timeZone).utcOffset(); } // 测试 console.log(getUtcOffsetMinutes('America/Los_Angeles')); // -420(夏令时) console.log(getUtcOffsetMinutes('America/New_York')); // -240(夏令时)
注意:所有方法都会自动适配夏令时/冬令时变化,返回当前时间对应的实时偏移量。
内容的提问来源于stack exchange,提问作者MasterJoe
相关产品推荐
相关产品推荐

