JS日期字符串怎么转成时间戳

作者:拾光

时间:2026-11-03

浏览:292

详细讲解在 JavaScript 中如何将各种格式的日期字符串安全、准确地转为时间戳。涵盖 Date.parse、getTime() 与一元加号的核心写法,深度剖析时区陷阱与8小时偏差成因,并提供全浏览器兼容的安全转换方案。

文章目录
分类:前端开发 / JavaScript 实战 阅读时长:约 6 分钟 环境适用:Node.js / 现代主流浏览器 / ES6+
在 JavaScript 中,将日期字符串转换成时间戳最直接的方式是使用静态方法 Date.parse(dateStr),或者构造日期对象后使用 new Date(dateStr).getTime() 与一元加号 +new Date(dateStr)。它们均能将合法的时间字符串转为自 1970 年 1 月 1 日 00:00:00 UTC 起算的13位毫秒级时间戳。但在真实业务开发中,不同日期格式、浏览器兼容性差异(如 Safari 对连字符的严格校验)以及时区判定规则,往往会导致解析出 NaN 或产生相差 8 小时的时间偏移。本文将一步到位梳理具体写法、底层运作逻辑、时区避坑技巧及健壮的生产级通用函数。
JS日期字符串怎么转成时间戳
图 0:JavaScript 日期字符串转 Unix 时间戳整体映射概览

一、快速上手:三种常用转换写法

JavaScript 原生提供了多种从日期文本提取时间戳的语法。在入参字符串符合标准(如 ISO 8601 格式或标准时间格式)的前提下,以下三种方式是最常用的实现手段:

1. Date.parse():开销最低的静态解析法

Date.parse() 是 Date 对象自带的静态方法。它直接接收一个日期字符串作为参数,返回解析后的毫秒级数值时间戳。如果字符串格式无法识别,则返回 NaN。

// 1. 标准 ISO 8601 字符串
const ts1 = Date.parse("2024-05-15T10:30:00Z");
console.log(ts1); // 示例输出:1715769000000

// 2. 普通日期时间字符串
const ts2 = Date.parse("2024/05/15 10:30:00");
console.log(ts2); // 示例输出:1715740200000 (按本地时区解析)

2. new Date().getTime():语义最明确的实例方法

先将日期字符串作为构造参数传递给 new Date() 得到一个日期实例,随后调用实例方法 .getTime() 获取时间戳。这种写法语义最为明确,并且便于在获取时间戳前进一步调用日期的其他方法。

const dateStr = "2024-05-15 10:30:00";
const dateObj = new Date(dateStr);
const timestamp = dateObj.getTime();
console.log(timestamp); // 示例输出:1715740200000

// 注:dateObj.valueOf() 与 dateObj.getTime() 返回完全相同的毫秒数

3. +new Date():最简洁的一元加号语法糖

在 new Date(dateStr) 实例前添加一元加号运算符 +,会触发 JavaScript 底层的隐式类型转换机制(调用对象的 Symbol.toPrimitive 或 valueOf()),从而将日期对象直接转为数字时间戳。

const timestamp = +new Date("2024-05-15 10:30:00");
console.log(timestamp); // 示例输出:1715740200000
JS日期字符串怎么转成时间戳
图 1:Date.parse()、getTime() 与一元加号的执行途径与底层特征

4. 毫秒级与秒级时间戳的换算

JavaScript 默认处理的均为 13位毫秒级时间戳。但许多后端语言(如 PHP、Go、Python 或 MySQL 的 UNIX_TIMESTAMP())在协议中约定的是 10位秒级时间戳。在传递给后端接口前,需要除以 1000 并向下取整:

const msTimestamp = Date.parse("2024-05-15 10:30:00");
// 转换为 10 位秒级时间戳
const secTimestamp = Math.floor(msTimestamp / 1000);
console.log(secTimestamp); // 示例输出:1715740200

二、时区与格式陷阱:“相差8小时”的根源剖析

很多开发者在初次进行日期转换时常遇到一个令人困惑的现象:同样是解析 5 月 15 日,为什么有时算出的时间戳在转换为本地时间后变成了早晨 8 点,或者与预期相差 8 个小时?

核心陷阱:纯日期字符串与含时间字符串的时区判定差异

根据 ECMAScript (ES5+) 规范标准:

• 形式如 "2024-05-15"(仅有短横线日期,无时间部分)会被严格当做 UTC 时间 零点(即 2024-05-15 00:00:00 GMT)处理;而在中国标准时间(UTC+8)的环境下,这相当于本地当天的早晨 08:00:00。

• 形式如 "2024-05-15 00:00:00"、"2024/05/15" 或未加 Z 标识的标准串,则会被大多数引擎作为 本地时区(Local Time) 零点处理。

JS日期字符串怎么转成时间戳
图 2:不同格式日期字符串的时区解析机制与“8小时偏差”对比图解

我们通过一段实际对比代码来观察两者的真实差距:

// 情况 A:纯短横线日期(标准 UTC 零点)
const t1 = Date.parse("2024-05-15");
// 情况 B:斜杠日期(浏览器本地时区零点)
const t2 = Date.parse("2024/05/15");

console.log(t1); // 1715731200000
console.log(t2); // 1715702400000
console.log((t1 - t2) / 3600000); // 结果精确相差 8 小时!

此外,苹果 Safari 及某些低版本 WebKit 浏览器对字符串格式要求极为严苛。在 Safari 中,直接解析 "2024-05-15 10:30:00" 这类带有短横线和空格的格式可能会直接返回 NaN(Invalid Date)。因此,在将短横线格式传递给解析方法前,将其替换为斜杠 / 是一种被业界长期验证的稳定兼容实践。

三、安全转换的标准化实施流程

为了在复杂多变的前端业务场景(表单输入、接口返回、跨浏览器终端)中保证转换的绝对可靠,建议按照以下 4 个阶段构建转换逻辑:

JS日期字符串怎么转成时间戳
图 3:生产环境日期字符串转时间戳标准化流水线
  1. 入参预处理与清洗:确保输入是有效字符串,调用 trim() 消除多余首尾空格;若包含 - 且属于普通时间串,可使用正则全局替换为 /,保障 Safari 等内核正常识别。
  2. 时间戳解析执行:调用 Date.parse() 或 new Date() 转换得到原始数值。
  3. 有效性校验拦截:利用 Number.isNaN(timestamp) 判断解析是否失败。遇到如 "2024-02-31"、"abc" 等非法格式时,及时返回 null 或触发错误兜底,避免 NaN 传入后续数据流。
  4. 对齐输出时间粒度:根据前后端协议约定,返回 13 位毫秒级数值或 10 位秒级数值。

基于上述步骤,我们可以封装出一个健壮易用的通用函数:

/**
 * 安全地将日期字符串转换为时间戳
 * @param {string} dateStr - 待转换的日期字符串
 * @param {boolean} inSeconds - 是否返回秒级时间戳(默认 false,返回毫秒)
 * @returns {number|null} 转换成功返回时间戳数值,失败返回 null
 */
function safeDateToTimestamp(dateStr, inSeconds = false) {
  if (!dateStr || typeof dateStr !== "string") {
    return null;
  }

  // 1. 清理空格,并将短横线转换为各浏览器广泛支持的斜杠(保留标准 ISO 的 T 格式)
  let formattedStr = dateStr.trim();
  if (!formattedStr.includes("T")) {
    formattedStr = formattedStr.replace(/-/g, "/");
  }

  // 2. 解析为时间戳
  const ms = Date.parse(formattedStr);

  // 3. 校验合法性
  if (Number.isNaN(ms)) {
    return null;
  }

  // 4. 单位对齐
  return inSeconds ? Math.floor(ms / 1000) : ms;
}

// --- 验证示例 ---
console.log(safeDateToTimestamp("2024-05-15 14:20:00"));       // 示例:1715754000000
console.log(safeDateToTimestamp("2024-05-15 14:20:00", true)); // 示例:1715754000 (秒级)
console.log(safeDateToTimestamp("非法时间字符串"));            // 示例:null

四、非标准与自定义日期字符串的处理方案

如果业务中接收到的日期字符串格式并不符合 ISO 或常见标准(例如中文日期 "2024年05月15日 14:30"、点号分隔 "2024.05.15" 或英文日期格式 "15-05-2024"),直接使用 Date.parse() 很可能得到 NaN。此时最稳妥的做法是使用正则表达式提取年月日时分秒各个分量,再通过 new Date(year, monthIndex, day, ...) 手动构造。

注意 Date 构造函数月份参数的“减 1”规则:

在 JavaScript 中,Date 构造函数传参形式为 new Date(year, monthIndex, day, hours, minutes, seconds),其中 monthIndex 是从 0(1月)到 11(12月)计算的。因此,传入提取出的月份数字时必须减去 1。

/**
 * 解析如 "2024年05月15日 14:30:00" 这类中文或自定义格式
 */
function parseCustomChineseDate(str) {
  // 使用正则匹配出所有连续数字:年、月、日、时、分、秒
  const matches = str.match(/\d+/g);
  if (!matches || matches.length < 3) {
    return null;
  }

  const year = parseInt(matches[0], 10);
  const month = parseInt(matches[1], 10) - 1; // 月份必须 - 1
  const day = parseInt(matches[2], 10);
  const hour = parseInt(matches[3] || 0, 10);
  const minute = parseInt(matches[4] || 0, 10);
  const second = parseInt(matches[5] || 0, 10);

  // 直接在本地时区构造 Date 实例
  const date = new Date(year, month, day, hour, minute, second);
  return date.getTime();
}

// 验证执行
const customTs = parseCustomChineseDate("2024年05月15日 14点30分");
console.log(customTs); // 示例输出:1715754600000

五、各转换方案对比与选型指南

为了帮助读者根据实际项目场景作出最合适的技术选择,下表对常见转换方式的特性进行了横向整理:

方法 / 方式 性能开销 浏览器兼容性 时区行为 推荐使用场景
Date.parse(str) 极低(无实例创建) 现代环境良好,老旧 Safari 遇短横线可能受限 纯日期为 UTC,其余依引擎实现 标准 ISO 8601 字符串或高性能解析场景
new Date(str).getTime() 低(创建单一对象) 替换斜杠后全平台高兼容 受字符串格式影响同上 绝大多数业务常规场景,语法语义明晰
+new Date(str) 低(创建单一对象) 同上 同上 内部简短计算、追求极简代码书写
正则拆解 + new Date(Y,M-1,D...) 中等(含正则运算) 全环境 100% 绝对兼容 固定按运行环境本地时区构造 中文日期、特殊格式、日期控件非标返回值
JS日期字符串怎么转成时间戳
图 4:JavaScript 日期字符串转时间戳全景选型决策矩阵与最佳实践

六、总结

将日期字符串转成时间戳是前端开发的高频基础操作。实现的核心逻辑可以概括为以下三点:

  • 标准格式首选简洁方案:对于标准的 ISO 8601 时间戳字符串,直接使用 Date.parse() 或 new Date().getTime() 即可快速获取 13 位毫秒时间戳。
  • 谨防时区漂移与兼容性差异:面对 "YYYY-MM-DD" 格式时,务必警惕其被当做 UTC 零点而产生的 8 小时本地时差;在处理非标准或含短横线的时间串时,转换为斜杠 / 能够避免 Safari 内核报错。
  • 生产环境坚持防御性编程:输入数据务必做空值检查与 Number.isNaN() 结果判定,并按接口协议确认时间戳单位(秒级或毫秒级),确保数据流稳定可靠。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章