← crypto.randomInt() 加密安全随机整数生成方法 fs.Dirent.isBlockDevice() 方法 →

Node.js日期解析与JSON解析:Date.parse()与JSON.parse()的正确用法

著
原创 2026-10-20 Node.js 已有人查阅

先把概念厘清:两个parse不是一回事

很多初学者会把Date.parse()和JSON.parse()混在一起谈,原因在于中文资料里常出现“Data.parse()”这类笔误。实际在Node.js环境中,这是两个职责不同的API:

  • Date.parse()属于JavaScript内置Date对象,作用是把日期字符串解析成毫秒时间戳(自1970-01-0100:00:00UTC起算)。

  • JSON.parse()属于全局JSON对象,作用是把JSON字符串反序列化为JavaScript对象。

Node.js借助V8引擎继承了这些标准能力,因此两者在浏览器与Node.js中行为一致。理解这一点,后续的选型和排错才不会跑偏。

Date.parse()的语法与返回值

标准语法只有一个参数:

Date.parse(dateString)

传入符合日期格式的字符串,返回一个数字型时间戳;若字符串无法被识别,返回NaN。这里有个容易被忽略的细节:Date.parse()的解析结果依赖运行时对日期格式的识别规则,不同格式(如2026-03-15、March15,2026、03/15/2026)在不同环境下可能得到不同结果,尤其是带时区偏移的写法。

console.log(Date.parse('2026-03-15'));        // 取决于本地时区解释
console.log(Date.parse('2026-03-15T00:00:00Z')); // 明确 UTC,结果稳定
console.log(Date.parse('not-a-date'));        // NaN

项目经验:凡是需要跨环境一致的时间戳,优先使用ISO8601带时区的写法,或在解析前统一格式,不要依赖Date.parse()对本地化字符串的“猜测”。

date-and-time模块:格式化解析的补充手段

标准Date.parse()不接受“格式模板”参数。当你拿到的是15/03/2026这种日/月顺序与美式相反的字符串时,直接交给Date.parse()容易出错。此时可以引入date-and-time模块,用模板显式声明格式:

const date = require('date-and-time');

const specificDate = new Date('March 15, 2026');
const formattedDate = specificDate.toLocaleDateString('en-GB'); // DD/MM/YYYY
const parsedValue = date.parse(formattedDate, 'DD/MM/YYYY');

console.log('Parsed date and time: ' + parsedValue);
// 输出形如:Parsed date and time: 1773504000000

注意这里date.parse()的第二个参数是格式模板,与标准Date.parse()的单参数签名不同。代码号学习编程时建议把两者分开记忆:标准API靠识别,模块API靠声明。

JSON.parse()的三个实用特性

JSON是前后端数据交换的主流格式,JSON.parse()在Node.js中承担反序列化职责。它的几个特性值得单独拎出来讲。

基础解析

const jsonString = '{"name": "John", "age": 30, "city": "New York"}';
const user = JSON.parse(jsonString);
console.log(user.name); // John

错误处理

输入不是合法JSON时,JSON.parse()会抛出SyntaxError,而不是返回null。因此生产代码必须用try...catch包裹,避免整个进程因一条脏数据崩溃:

try {
  const invalidJsonString = '{"name": "John", "age": 30';
  const user = JSON.parse(invalidJsonString);
} catch (error) {
  console.error('Invalid JSON:', error.message);
}

个人建议:在接口层统一做一次JSON校验与降级处理,比在每个调用点散落try...catch更易维护。

reviver函数

第二个参数reviver可以在返回对象前对每个键值做二次加工,适合做类型修正或字段脱敏:

const jsonString = '{"name": "John", "age": 30, "city": "New York"}';
const user = JSON.parse(jsonString, (key, value) => {
  if (key === 'age') {
    return value + 1;
  }
  return value;
});
console.log(user.age); // 31

项目反思:reviver适合轻量转换,不建议在里面写复杂业务逻辑或异步操作,否则调试成本会明显上升。

项目实例:日志时间戳归一化与配置读取

实例一:接口返回时间字段统一转时间戳

后端返回的日期字段格式不统一时,先用date-and-time按模板解析,再存为毫秒数便于比较与排序:

const date = require('date-and-time');

function toTimestamp(str) {
  const parsed = date.parse(str, 'YYYY-MM-DD HH:mm:ss');
  return Number.isNaN(parsed.getTime()) ? null : parsed.getTime();
}

这里没有直接用Date.parse(),原因是模板明确、结果可预期;对无效输入返回null而非抛异常,便于上层做兜底。

实例二:读取JSON配置文件

const fs = require('fs');

function loadConfig(path) {
  try {
    const raw = fs.readFileSync(path, 'utf-8');
    return JSON.parse(raw);
  } catch (error) {
    console.error('Config parse failed:', error.message);
    return {};
  }
}

这类场景中JSON.parse()的SyntaxError是主要风险点,配合默认返回值可以让服务在配置损坏时仍能启动并给出提示。

本节课程知识要点

  • 标准Date.parse()只接收日期字符串,返回毫秒数,无法识别时返回NaN;格式模板能力需借助date-and-time等模块。

  • 跨环境一致的时间解析优先使用ISO8601带时区写法。

  • JSON.parse()解析失败抛SyntaxError,必须做错误处理;reviver适合轻量转换。

  • 选型原则:需要严格格式控制用模块解析,需要标准时间戳用内置API,需要对象反序列化用JSON.parse()。

练习与思考

  1. 分别用Date.parse()和date.parse()解析'15/03/2026',观察结果差异并解释原因。

  2. 给JSON.parse()写一个reviver,把字符串形式的数字字段转成number类型。

  3. 设计一个函数,输入任意日期字符串,输出UTC时间戳或null,并说明你的错误处理策略。

← crypto.randomInt() 加密安全随机整数生成方法 fs.Dirent.isBlockDevice() 方法 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号