Javascript/Apps Script中指定时区日期字符串转零点日期对象方法
核心前提说明
JavaScript 原生
Date对象本身不存储时区信息,仅存储UTC时间戳。我们实际实现的是构造出对应指定时区指定日期00:00:00的UTC时间戳,后续用该Date对象在指定时区下格式化时,就会展示为目标日期0点。
步骤1:从时区变量t中提取可用标识
变量t的格式为(GMT -05:00) Eastern Time,你可以选择两种提取方式:
- 提取GMT偏移量:通用所有场景,但是夏令时切换期间可能有误差
- 提取IANA时区名:比如
Eastern Time对应America/New_York,夏令时适配更准确
方案1:通用JavaScript实现
// 从t中提取GMT偏移分钟数,例如(GMT -05:00)返回-300,(GMT +08:00)返回480 function getOffsetFromTzStr(t) { const match = t.match(/GMT\s*([+-])(\d{2}):(\d{2})/); if (!match) return 0; const sign = match[1] === '+' ? 1 : -1; const hours = parseInt(match[2], 10); const mins = parseInt(match[3], 10); return sign * (hours * 60 + mins); } // 构造目标日期对象 function getDateInTz(dateStr, tzOffsetMins) { const [year, month, day] = dateStr.split('-').map(Number); // 构造对应日期的UTC基准时间,再减去时区偏移得到目标时区0点对应的UTC时间戳 const utcDate = new Date(Date.UTC(year, month - 1, day)); utcDate.setTime(utcDate.getTime() - tzOffsetMins * 60 * 1000); return utcDate; } // 调用示例 const dateStr = '2024-05-20'; const t = '(GMT -05:00) Eastern Time'; const tzOffset = getOffsetFromTzStr(t); const targetDate = getDateInTz(dateStr, tzOffset); // 验证:用对应时区格式化,输出为 2024/5/20 00:00:00 console.log(new Intl.DateTimeFormat('zh-CN', { timeZone: 'America/New_York', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }).format(targetDate));
方案2:Google Apps Script 专属实现
Apps Script内置时区处理工具,适配夏令时更方便:
function getGsDateInTz(dateStr, t) { // 可扩展时区字符串到IANA时区的映射表,这里以常见时区为例 const tzMap = { 'Eastern Time': 'America/New_York', 'Central Time': 'America/Chicago', 'Beijing Time': 'Asia/Shanghai' }; const tzName = t.match(/\)\s*(.+)$/)[1]; const tzIana = tzMap[tzName] || Session.getScriptTimeZone(); // 直接按指定时区解析为0点的日期对象 return Utilities.parseDate(`${dateStr} 00:00:00`, tzIana, 'yyyy-MM-dd HH:mm:ss'); } // 调用示例 const dateStr = '2024-05-20'; const t = '(GMT -05:00) Eastern Time'; const targetDate = getGsDateInTz(dateStr, t); // 验证:输出为 2024-05-20 00:00:00 Logger.log(Utilities.formatDate(targetDate, 'America/New_York', 'yyyy-MM-dd HH:mm:ss'));
注意事项
- 存在夏令时的时区建议优先使用IANA时区解析,不要用固定GMT偏移,避免时间计算错误。
- 如果需要兼容旧版浏览器,建议优先使用偏移计算方案,IANA时区识别依赖ES6+支持。
内容的提问来源于stack exchange,提问作者Scavanger
相关产品推荐
相关产品推荐

