JS怎么获取当前日期并格式化为YYYY-MM-DD
详细讲解在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
一、为什么简单的日期提取容易出错?
很多刚接触 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()。
二、分步操作:原生代码实现全流程
接下来我们按照标准软件工程规范,将“获取当前日期并格式化”拆解为清晰的四个操作步骤。
步骤 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 依然处于前一天的下午或夜晚。此时调用该方法,得到的日期将比本地日期整整少一天!
四、其他原生优雅方案: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 (需安装依赖) | ★★★★☆ (复杂场景推荐) |
六、总结与开发自查清单
获取当前日期并格式化为 YYYY-MM-DD 是日常前端与 Node.js 开发中最高频的基础操作之一。理解其背后的原理不仅能帮助我们写出简洁的代码,更能避免上线后的时区回退隐患。
在日常编码中,记住三个关键动作:实例化对象、月份加一并用 getDate 读取日、借助 padStart(2, '0') 补齐两位。按照这套标准化流程编写代码,既能保障跨浏览器运行的绝对稳定性,又能彻底杜绝由时区转换带来的潜在业务缺陷。
为什么叫JavaScript:语言命名由来及与Java的历史渊源
2026-11-05 11:37:48
JS获取当前时间年月日时分秒并格式化为YYYY-MM-DD HH:mm:ss
2026-11-04 21:25:21
不同语言间JS与Java/Python加密结果不一致怎么办
2026-11-04 18:27:23
Mock.js 拦截 Axios 和 Fetch 请求的原理与配置方法
2026-11-04 08:13:59
怎么用JS在网页上实时动态显示当前时间
2026-11-03 17:20:33








