← 中文资源

简体中文版本

JavaScript Invalid Date — 解析得到 NaN 时间

通过使用 ISO 8601 输入、检查 Number.isNaN(date.getTime()),并避免依赖浏览器的日期字符串解析,修复 Invalid Date。

阅读英文原文

症状

本篇指南处理“JavaScript Invalid Date — 解析得到 NaN 时间”。请从症状出发,按顺序执行诊断,在推进前确认每个假设;随后通过修复与验证步骤闭环。

可观察到的症状包括:

  • new Date(“…”) 打印为 “Invalid Date”,getTime() 为 NaN
  • 格式化日期在输出中得到 NaN
  • 在 Chrome 可用,在 Safari 失败

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

node -e "const d=new Date("not a date"); console.log(d.toString(), Number.isNaN(d.getTime()))"

非法日期的 getTime() 返回 NaN;对它用 isNaN 是可靠的合法性判断。

步骤 2

new Date("2024-03-04T10:00:00Z").toISOString()

带明确时区的 ISO 8601 在各引擎间解析一致。

常见诱因(按出现频率排序):

  • 字符串不是引擎接受的格式(尤其非 ISO 时 Safari 失败)
  • 月/日顺序有歧义(如 “03/04/2024”)
  • 向构造函数传入了非法值(空串、null)

根因

Date 构造函数可靠地接受 ISO 8601,但把大多数其他字符串视为实现相关。无法识别的字符串会产生时间值为 NaN 的 Date,显示为 Invalid Date。

修复

把输入规范化为 ISO 8601(可带时区),自定义格式显式解析,并在使用前以 Number.isNaN(date.getTime()) 校验;非法时回退或抛错。

注意:依赖 Date 解析本地化格式不可移植;应使用日期库或显式解析。

function parseDate(input) {
  const d = new Date(input);
  if (Number.isNaN(d.getTime())) {
    throw new RangeError(`invalid date: ${input}`);
  }
  return d;
}

parseDate('2024-03-04T10:00:00Z'); // ISO, reliable
// parseDate('03/04/2024');         // throws -> engine-dependent, avoid

验证

在 Node 与浏览器上分别解析并确认都有效;在测试中断言 getTime() 为有限数。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。