You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用第三方库的情况下将指定时区的日期时间转换为UTC时间戳

如何在不使用第三方库的情况下,将指定时区的日期时间转换为UTC时间戳?

问题描述

你有拆分格式的日期和时间数据:

const date = {year: 2020, month: 12, day: 31};
const time = {hours: 16, minutes: 2};

需要实现一个 convertToUTC(date, time, timeZone) 函数,输入上述数据和时区标识符(如 "Europe/Moscow"、"America/New_York"),返回对应的UTC时间戳(秒级)。示例如下:

convertToUTC({year: 2021, month: 7, day: 30}, {hours: 16, minutes: 15}, "Europe/Moscow") // => 1627650900
convertToUTC({year: 2021, month: 7, day: 30}, {hours: 16, minutes: 15}, "America/New_York") // => 1627676100

解决方案

这里提供一个纯原生JS的实现,利用Intl.DateTimeFormat处理时区逻辑,无需任何第三方库:

function convertToUTC(date, time, timeZone) {
    // 初始化格式化器:指定时区,输出带偏移的时间各部分
    const formatter = new Intl.DateTimeFormat('en-US', {
        timeZone: timeZone,
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit',
        hour12: false,
        timeZoneName: 'shortOffset'
    });

    // 获取格式化器的默认输出结构,替换为目标日期时间值
    const targetParts = formatter.formatToParts(new Date()).map(part => {
        switch (part.type) {
            case 'year':
                return { type: part.type, value: String(date.year) };
            case 'month':
                return { type: part.type, value: String(date.month).padStart(2, '0') };
            case 'day':
                return { type: part.type, value: String(date.day).padStart(2, '0') };
            case 'hour':
                return { type: part.type, value: String(time.hours).padStart(2, '0') };
            case 'minute':
                return { type: part.type, value: String(time.minutes).padStart(2, '0') };
            case 'second':
                return { type: part.type, value: '00' };
            default:
                return part;
        }
    });

    // 拼接成带时区偏移的完整时间字符串
    const targetDateTimeStr = targetParts.map(part => part.value).join('');

    // 解析字符串为Date对象,转换为秒级UTC时间戳
    return Math.floor(Date.parse(targetDateTimeStr) / 1000);
}

代码解释

  1. 时区格式化器:Intl.DateTimeFormat是原生JS用于处理国际化日期时间格式的API,通过timeZone参数指定目标时区,同时配置输出包含时区偏移(timeZoneName: 'shortOffset')。
  2. 替换时间部分:先获取格式化器的默认输出结构(比如分隔符、时区标记等),再将其中的年、月、日、时、分、秒替换为输入的目标值,确保格式与时区要求一致。
  3. 解析时间戳:将拼接好的带时区偏移的时间字符串传入Date.parse(),得到毫秒级UTC时间戳,最后除以1000转换为秒级时间戳。

注意事项

  • 补零处理:月份、日期、小时、分钟需要用padStart(2, '0')补为两位数字,因为Intl.DateTimeFormat默认输出两位格式,保持格式一致才能被Date.parse()正确解析。
  • 兼容性:该方法依赖现代浏览器对Intl.DateTimeFormat的支持,Chrome、Firefox、Edge、Safari 10+以及Node.js v12+都能正常运行。
  • 夏令时适配:Intl.DateTimeFormat会自动处理时区的夏令时偏移变化,无需手动计算,确保不同时间段的转换准确。

内容的提问来源于stack exchange,提问作者achempion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 23:27:31