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

TypeScript跨时区全维度日期差值计算及新日期生成问题

TypeScript 跨时区全维度日期差值计算与叠加实现

核心思路

  • 所有日期运算基于Unix 时间戳完成,天生跨时区兼容,避免不同时区偏移导致的计算误差
  • 先将输入的日期字符串统一解析为 Date 对象,转换为毫秒级时间戳计算差值
  • 差值直接叠加到 date1 的时间戳上,再转换为指定格式的字符串输出

完整代码实现

/**
 * 解析 DD/MM/YYYY HH:mm:ss 格式的日期字符串为 Date 对象
 * @param dateStr 输入的日期字符串,格式为 DD/MM/YYYY HH:mm:ss
 */
function parseCustomDate(dateStr: string): Date {
  const [datePart, timePart] = dateStr.split(' ')
  const [day, month, year] = datePart.split('/').map(Number)
  const [hour, minute, second] = timePart.split(':').map(Number)
  // 月份从0开始计数,所以要减1
  return new Date(year, month - 1, day, hour, minute, second)
}

/**
 * 将 Date 对象格式化为 DD/MM/YYYY HH:mm:ss 字符串
 * @param date 要格式化的日期对象
 */
function formatCustomDate(date: Date): string {
  const day = String(date.getDate()).padStart(2, '0')
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const year = date.getFullYear()
  const hour = String(date.getHours()).padStart(2, '0')
  const minute = String(date.getMinutes()).padStart(2, '0')
  const second = String(date.getSeconds()).padStart(2, '0')
  return `${day}/${month}/${year} ${hour}:${minute}:${second}`
}

/**
 * 计算两个日期的差值并叠加到date1上返回新日期
 * @param date1Str 第一个日期字符串(DD/MM/YYYY HH:mm:ss)
 * @param date2Str 第二个日期字符串(DD/MM/YYYY HH:mm:ss)
 */
function calculateNewDate(date1Str: string, date2Str: string): string {
  const date1 = parseCustomDate(date1Str)
  const date2 = parseCustomDate(date2Str)
  
  // 计算毫秒级差值,天生包含年/月/日/时/分/秒/毫秒全维度信息
  const diffMs = date1.getTime() - date2.getTime()
  
  // 差值叠加到date1上
  const newDateTs = date1.getTime() + diffMs
  const newDate = new Date(newDateTs)
  
  return formatCustomDate(newDate)
}

// 测试示例
const date1 = "10/06/2021 10:10:05"
const date2 = "08/06/2021 11:10:05"
const result = calculateNewDate(date1, date2)
console.log(result) // 输出:12/06/2021 09:10:05

实现说明

  • 时区兼容:所有运算基于时间戳完成,不同时区的设备运行时得到的计算结果完全一致,不会出现时区偏移误差
  • 全维度覆盖:毫秒级差值本身就包含了从毫秒到年的所有时间维度差异,不需要单独拆分计算年/月/日等维度,避免月天数不同、闰年等边界问题
  • 如果输入日期格式不是示例的DD/MM/YYYY HH:mm:ss,只需要修改parseCustomDate和formatCustomDate两个函数的解析和格式化逻辑即可,核心计算逻辑不需要调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 09:15:02