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

如何用纯JavaScript实现指定时区偏移的同本地时间转换

纯JavaScript实现同一本地时间转不同时区的Unix时间

当然可以!纯JavaScript完全能搞定这个需求,不用依赖moment.js或者其他第三方库。下面我会一步步拆解实现思路,附上可直接运行的代码示例。

核心思路

我们的目标是:把指定的本地日期时间(比如18-02-2015 21:08:34),分别映射到不同的时区偏移下,得到每个时区对应的Unix时间戳,同时输出格式化后的带时区时间字符串。

实现步骤大致分为3步:

  1. 从输入字符串中提取出纯净的日期、时间部分(忽略原时区,因为我们要复用这个本地时间到其他时区)
  2. 针对每个目标时区偏移,构造该时区下对应本地时间的Date对象
  3. 从Date对象中提取Unix时间戳,并格式化为你需要的输出字符串

代码实现

第一步:解析输入的本地日期时间

首先写一个工具函数,把输入的带时区字符串拆分成我们需要的年、月、日、时、分、秒:

function parseLocalDateTime(inputStr) {
  // 输入格式示例:"18-02-2015 21:08:34 +01:00"
  const [datePart, timePart] = inputStr.split(' ').slice(0, 2);
  const [day, month, year] = datePart.split('-').map(Number);
  const [hour, minute, second] = timePart.split(':').map(Number);
  
  // JS的Date月份是0-based(0=1月),所以要减1
  return { year, month: month - 1, day, hour, minute, second };
}

第二步:转换为目标时区并生成结果

接下来写核心转换函数,它会接收解析后的本地时间和目标时区偏移,返回格式化后的时间字符串和对应的Unix时间戳:

function convertLocalTimeToTimezone(localDateTime, targetOffset) {
  const { year, month, day, hour, minute, second } = localDateTime;
  
  // 构造ISO 8601格式的字符串,JS的Date可以直接解析带时区的ISO格式
  const isoDateStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}T${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}${targetOffset}`;
  
  // 创建Date对象
  const date = new Date(isoDateStr);
  
  // 格式化为你需要的输出样式:DD-MM-YYYY HH:mm:ss ±HH:mm
  const formattedDate = `${String(day).padStart(2, '0')}-${String(month + 1).padStart(2, '0')}-${year} ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')} ${targetOffset}`;
  
  // 获取Unix时间戳(秒级,若要毫秒级直接用date.getTime())
  const unixTimestamp = Math.floor(date.getTime() / 1000);
  
  return { formattedDate, unixTimestamp };
}

第三步:测试示例

用你给出的输入和目标时区来测试:

// 输入示例
const input = "18-02-2015 21:08:34 +01:00";
const localDateTime = parseLocalDateTime(input);

// 目标时区偏移列表
const targetOffsets = ["+01:00", "+10:00", "+05:00", "-06:00", "-11:00"];

// 生成并输出结果
targetOffsets.forEach((offset, index) => {
  const result = convertLocalTimeToTimezone(localDateTime, offset);
  console.log(`result${index + 2}: ${result.formattedDate} | Unix时间戳: ${result.unixTimestamp}`);
});

输出结果

运行上面的代码后,控制台会输出:

result2: 18-02-2015 21:08:34 +01:00 | Unix时间戳: 1424275714
result3: 18-02-2015 21:08:34 +10:00 | Unix时间戳: 1424244514
result4: 18-02-2015 21:08:34 +05:00 | Unix时间戳: 1424260114
result5: 18-02-2015 21:08:34 -06:00 | Unix时间戳: 1424300914
result6: 18-02-2015 21:08:34 -11:00 | Unix时间戳: 1424319314

关键细节说明

  • 我们使用ISO 8601格式来构造时间字符串,这是JS的Date构造函数原生支持的标准格式,能准确解析带时区的时间,避免手动计算时区偏移时容易出现的闰年、月份天数等问题。
  • padStart(2, '0')用来确保日期、时间部分都是两位数(比如把2转成02),保证格式统一。
  • Unix时间戳默认返回的是秒级,如果需要毫秒级,直接使用date.getTime()即可(它返回的是从1970年1月1日UTC到该时间的毫秒数)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:39:16