如何在JavaScript中获取指定时区的夏令时偏移量
解决指定时区夏令时差值获取问题
原生JavaScript的Date对象依赖系统本地时区,所以要获取指定时区的夏令时(DST)差值,需要借助Intl.DateTimeFormat API解析目标时区的时间偏移信息,实现类似Java中zone.getDSTSavings()的功能。
修改后的实现代码
let date = new Date(1995, 11, 17); console.log("当前日期", date); function getDSTChange(date, timezone) { // 未指定时区时,保留原有系统本地时区逻辑 if (!timezone) { const jan = new Date(date.getFullYear(), 0, 1).getTimezoneOffset(); const july = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); let diff = Math.max(jan, july) - date.getTimezoneOffset(); console.log("夏令时差值", diff); return diff; } // 指定时区的处理逻辑 const year = date.getFullYear(); // 创建目标时区的格式化器,用于提取时间偏移 const getTimezoneOffset = (dt) => { const dateStr = dt.toLocaleString('en-US', { timeZone: timezone, timeZoneName: 'longOffset' }); const offsetMatch = dateStr.match(/([+-]\d{2}:\d{2})/); if (offsetMatch) { const [hours, mins] = offsetMatch[1].split(':').map(Number); // 转换为与Date.getTimezoneOffset一致的格式:本地时间 = UTC - 偏移量 return -(hours * 60 + mins); } return 0; }; // 取同一年中两个代表性日期:1月1日(通常非夏令时)、7月1日(通常夏令时,南半球逻辑自动适配) const janOffset = getTimezoneOffset(new Date(year, 0, 1)); const julOffset = getTimezoneOffset(new Date(year, 6, 1)); // 夏令时标准差值为两个偏移的绝对值差 const dstSavings = Math.abs(janOffset - julOffset); console.log(`${timezone}的夏令时标准差值`, dstSavings); return dstSavings; } getDSTChange(date, 'Asia/Calcutta'); // 返回0 getDSTChange(date, 'Australia/Melbourne'); // 返回60
代码说明
- 指定时区适配:通过
toLocaleString指定目标时区,提取带偏移的时间字符串,解析出时区偏移量。 - 偏移格式统一:将时区偏移(如
+10:00)转换为与Date.getTimezoneOffset()一致的计算格式,保证逻辑统一。 - DST差值计算:对比同一年1月和7月的时区偏移,两者的绝对值差就是该时区的标准夏令时差值——加尔各答全年偏移无变化,差值为0;墨尔本夏令时比标准时间快60分钟,差值为60。
- 兼容性:
Intl.DateTimeFormat是ES6标准API,现代浏览器、Node.js均支持。
内容的提问来源于stack exchange,提问作者Pavan Kumar
相关产品推荐
相关产品推荐

