JS怎么获取当前日期并格式化为YYYY-MM-DD

作者:阿沐时间:2026-11-03 18:47:03浏览:644

详细讲解在JavaScript中获取当前本地日期并格式化为标准YYYY-MM-DD格式的方法。包含原生Date解析、双位数补零技巧、时区偏差避坑指南以及通用函数封装。

在 JavaScript 中获取当前日期并转换成标准的 YYYY-MM-DD 格式(如 2026-10-31),最直接且安全的原生做法是:使用 new Date() 实例化当前时间,依次通过 getFullYear()、getMonth() + 1 和 getDate() 取出年、月、日数值,再使用 padStart(2, '0') 将单数的月和日补齐为两位数,最后用模板字符串拼接成目标文本。

const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');

const formattedDate = `${year}-${month}-${day}`;
console.log(formattedDate); // 示例输出:2026-10-31
JS怎么获取当前日期并格式化为YYYY-MM-DD
图 1:JavaScript 本地日期对象到 YYYY-MM-DD 字符串的完整处理链路

一、为什么简单的日期提取容易出错?

很多刚接触 JavaScript 的开发者在第一次尝试将日期格式化为 YYYY-MM-DD 时,通常会遇到两个典型的隐性问题:一个是月份计算结果莫名少了一个月,另一个则是日期是单数(如 8 月 5 日),输出变成了 2026-8-5,无法满足数据库存储、接口传参或 HTML 日期输入框(<input type="date">)所强制要求的两位固定宽度规范。

JavaScript 的内置 Date 对象设计源自早期 Java 1.0 的规范,其中保留了几个极其容易混淆的设计细节:

  • 月份索引从 0 开始:date.getMonth() 返回的整数区间是 0 到 11。其中 0 代表一月,9 代表十月,11 代表十二月。因此在获取真实自然月份时,必须手动加 1。
  • 日与星期的混淆:读取当前是当月的第几天,对应的方法是 date.getDate()(返回 1 到 31);而 date.getDay() 返回的是星期几(0 代表周日,1 到 6 代表周一至周六)。初学者极易因为英文习惯误用 getDay()。
  • 年份必须使用 getFullYear():老旧方法中存在 getYear(),它返回的是当前年份减去 1900 后的差值(例如 2026 年会返回 126),早已被废弃。获取 4 位完整年份必须使用 getFullYear()。

二、分步操作:原生代码实现全流程

接下来我们按照标准软件工程规范,将“获取当前日期并格式化”拆解为清晰的四个操作步骤。

JS怎么获取当前日期并格式化为YYYY-MM-DD
图 2:JavaScript 原生格式化 YYYY-MM-DD 的 4 步标准操作规程

步骤 1:获取时间实例

运行 const now = new Date(); 会实例化一个包含当前精确时刻的日期对象。该对象内部保存的是基于协调世界时(UTC)的时间戳,但当调用它的本地方法时,会自动转换为当前终端设备所在时区的时间。

步骤 2:读取年、月、日数值并修正

分别取出日期的核心部件,并针对月份加 1 修正:

const year = now.getFullYear();       // 返回 4 位数字年份,如 2026
const month = now.getMonth() + 1;      // 注意:getMonth() 取值范围是 0~11,必须 +1
const day = now.getDate();             // 返回 1~31,表示当月几号(切勿用 getDay)

步骤 3:补齐双位数(Pad Zero)

在 ISO 8601 标准及绝大多数系统接口中,月份与日期必须保持两位宽度。如果月份为 5,必须呈现为 "05"。现代 JavaScript 提供了极其方便的内置字符串方法:padStart()。

// 将数字转为字符串后,若长度不足 2 位,则在头部填充 '0'
const formattedMonth = String(month).padStart(2, '0');
const formattedDay = String(day).padStart(2, '0');

如果需要在不支持 ES2017 的极老旧运行环境中工作,也可以使用经典的负向截取法:

// 兼容老环境的替代写法:先拼 '0' 再截取倒数两位
const formattedMonthOld = ('0' + month).slice(-2);
const formattedDayOld = ('0' + day).slice(-2);

步骤 4:组装并封装为复用函数

为了在业务项目中便捷调用,推荐将其封装为一个通用的纯函数。该函数支持传入任意 Date 对象,不传参时默认使用当前时间:

/**
 * 将传入的日期对象转换为 YYYY-MM-DD 格式
 * @param {Date} [date=new Date()] 要格式化的日期对象,默认为当前时间
 * @returns {string} 格式化后的日期字符串,如 "2026-10-31"
 */
function formatLocalDate(date = new Date()) {
  const y = date.getFullYear();
  const m = String(date.getMonth() + 1).padStart(2, '0');
  const d = String(date.getDate()).padStart(2, '0');
  return `${y}-${m}-${d}`;
}

// 调用示例
console.log(formatLocalDate()); // 示例输出:"2026-10-31"

三、警惕经典陷阱:toISOString() 的时区偏差

在网络上搜索“一行代码格式化 YYYY-MM-DD”时,常会看到以下这行流传甚广的代码:

// 警告:存在严重时区 BUG 的简写方式
const dateString = new Date().toISOString().split('T')[0];
⚠️ 高危隐患:早晨访问可能导致日期“倒退一天”

toISOString() 强制返回的是零时区(UTC 协调世界时)的 ISO 字符串,而不是你当前设备所处的本地时间。在东八区(中国标准时间 UTC+8),每天早晨 08:00 以前,UTC 依然处于前一天的下午或夜晚。此时调用该方法,得到的日期将比本地日期整整少一天!

JS怎么获取当前日期并格式化为YYYY-MM-DD
图 3:toISOString() 强制零时区导致的早晨“日期倒退”问题图解

四、其他原生优雅方案:Intl 与 toLocaleDateString

除了手动拆解拼接,现代 JavaScript 还提供了面向国际化标准的 Intl 命名空间和扩展参数。在某些业务场景下,这些方案同样非常实用。

1. 加拿大英语区域捷径(en-CA)

在国际标准中,加拿大官方英语环境(en-CA)的标准短日期书写格式恰好严格遵循 YYYY-MM-DD。同时,toLocaleDateString 会默认遵循用户设备的本地时区,从而避免了时区回退问题:

// 利用 en-CA 区域默认的 YYYY-MM-DD 规则
const today = new Date().toLocaleDateString('en-CA');
console.log(today); // 示例输出:"2026-10-31"

适用场景与边界:这种写法只有一行代码,极其简短,并且严格按照本地时区换算。但需要注意:如果代码运行在精简版 Node.js(移除了完整 ICU 数据包)或极小众的嵌入式 JS 引擎中,某些区域的本地化规则可能缺失。对于现代主流浏览器与标准服务器环境,该特性已被广泛支持。

2. 使用 Intl.DateTimeFormat 结构化提取

当需要严谨控制时区、且不想手动拼接字符串时,可以使用 Intl.DateTimeFormat 的 formatToParts() 方法:

function formatWithIntl(date = new Date()) {
  const formatter = new Intl.DateTimeFormat('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit'
  });

  const parts = formatter.formatToParts(date);
  const y = parts.find(p => p.type === 'year').value;
  const m = parts.find(p => p.type === 'month').value;
  const d = parts.find(p => p.type === 'day').value;

  return `${y}-${m}-${d}`;
}

五、各实现方案的综合对比与选型建议

在实际项目开发中,选择何种方式取决于项目的依赖规模、执行频率和兼容性需求。下表与图示直观呈现了四种主流思路的权衡对比:

实现方式 代码示例 时区安全性 浏览器兼容性 依赖体积 综合推荐度
手动提取 + padStart getFullYear() + padStart 安全 (本地时区) ES2017+ (全主流支持) 0 KB (纯原生) ★★★★★ (最推荐)
区域转换 (en-CA) toLocaleDateString('en-CA') 安全 (本地时区) 现代环境广泛支持 0 KB (纯原生) ★★★★☆ (轻量推荐)
ISO 字符串截取 toISOString().slice(0, 10) 高危 (UTC时区偏移) ES5+ 0 KB (纯原生) ★☆☆☆☆ (严禁展示用)
第三方库 (Day.js) dayjs().format('YYYY-MM-DD') 安全 (默认本地) 极高 (内置Polyfill) 约 2 KB (需安装依赖) ★★★★☆ (复杂场景推荐)
JS怎么获取当前日期并格式化为YYYY-MM-DD
图 4:四种主流日期格式化技术方案特性与选型对比

六、总结与开发自查清单

获取当前日期并格式化为 YYYY-MM-DD 是日常前端与 Node.js 开发中最高频的基础操作之一。理解其背后的原理不仅能帮助我们写出简洁的代码,更能避免上线后的时区回退隐患。

JS怎么获取当前日期并格式化为YYYY-MM-DD
图 5:日期格式化开发决策全景图与生产代码自查清单

在日常编码中,记住三个关键动作:实例化对象、月份加一并用 getDate 读取日、借助 padStart(2, '0') 补齐两位。按照这套标准化流程编写代码,既能保障跨浏览器运行的绝对稳定性,又能彻底杜绝由时区转换带来的潜在业务缺陷。

作者最新文章
相关文章
更多