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
相关产品推荐
相关产品推荐

