详细介绍怎么使用轻量级库 Day.js 将 JavaScript 原生日期、时间戳或 ISO 字符串转换为 8 位 yyyymmdd 纯数字格式。涵盖安装引入、核心占位符大小写规范、常见错误排查及生产环境时区防坑实践。
怎么使用Day.js将JS日期格式化为yyyymmdd
时间:2026-11-12
浏览:173
文章目录
20250518 的 8 位紧凑纯数字字符串(即日常口语中的 yyyymmdd 格式)。在 JavaScript 中使用轻量时间库 Day.js,最直接有效的做法是调用 dayjs(date).format('YYYYMMDD')。但需要格外注意:Day.js 中的格式占位符必须全部大写为 YYYYMMDD,若写成小写的 yyyymmdd,月份会被误解析成分钟,日期会被误解析为星期缩写。本文将从安装引入、占位符语法、多数据源解析及边界时区防护四个方面,系统讲解如何规范完成这一格式化操作。
一、核心语法与占位符规范
日常业务交流中大家习惯将“年月日”简写为 yyyymmdd,但在绝大多数日期时间库(包括 Day.js、Moment.js 等)的语法规范中,模板字符具有严格的语义区分与大小写敏感度。
将当前时间或指定日期转换为 8 位纯数字日期,核心代码只有一行:
import dayjs from 'dayjs';
// 1. 格式化当前系统时间
const currentDate = dayjs().format('YYYYMMDD');
console.log(currentDate); // 示例输出: '20250518'
// 2. 格式化指定的 JavaScript 原生 Date 实例
const customDate = new Date('2025-05-18T14:30:00');
const formattedDate = dayjs(customDate).format('YYYYMMDD');
console.log(formattedDate); // 示例输出: '20250518'
'yyyymmdd'?在 Day.js 占位符定义中:
YYYY:表示 4 位完整年份(如 2025);小写yyyy属于非法 Token,会被原样输出为字符'yyyy'。MM:表示 2 位补零月份(01 到 12);小写mm表示分钟(00 到 59)!DD:表示 2 位补零日期(01 到 31);小写dd表示星期简写(如 Su, Mo)!
dayjs('2025-05-18 14:30:00').format('yyyymmdd'),最终输出的结果会是荒唐的 'yyyy30Su',导致业务逻辑出现严重缺陷。
| 占位符 Token | 含义 | 输出示例 (以 2025-05-18 14:30 为例) | 正确/错误说明 |
|---|---|---|---|
YYYY |
4 位年份 | 2025 | ✓ 正确:获取完整公历年份 |
yyyy |
未定义 Token | yyyy | ✕ 错误:Day.js 无法识别,直接输出字面量 |
MM |
2 位月份(自动前导补零) | 05 | ✓ 正确:01-12 范围内的两位数字 |
mm |
2 位分钟数(00-59) | 30 | ✕ 错误:取到了时间的“分钟”,而非月份 |
DD |
2 位日期(自动前导补零) | 18 | ✓ 正确:01-31 范围内的两位数字 |
dd |
星期两字母简称 | Su | ✕ 错误:取到了星期缩写(Sunday → Su) |
二、环境依赖接入与项目引入
Day.js 是一个大小仅约 2KB 的现代化轻量时间处理库,与 Moment.js 的 API 设计高度兼容,但在体积和不可变数据(Immutable)设计上更为先进。在实际项目中使用前,需先完成依赖安装或脚本引入。
1. 在现代包管理工程中安装 (Vue / React / Node.js)
# 使用 npm
npm install dayjs
# 或使用 yarn
yarn add dayjs
# 或使用 pnpm
pnpm add dayjs
2. 在代码中导入
根据项目架构采用对应的模块导入语法:
// ES Module / Vite / Webpack / TypeScript
import dayjs from 'dayjs';
// CommonJS (Node.js 后端服务)
const dayjs = require('dayjs');
3. 在传统 HTML 页面中使用 CDN 直接加载
如果不使用前端构建工具,可直接在 HTML 头部通过 CDN 脚本载入,全局将自动挂载 window.dayjs 函数:
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script>
<script>
const yyyymmdd = dayjs().format('YYYYMMDD');
console.log(yyyymmdd);
</script>
三、多数据源解析:原生 Date、时间戳与字符串
在真实开发中,日期的初始来源多种多样,包括服务端接口返回的 10 位/13 位时间戳、标准 ISO 8601 字符串或带分隔符的格式。Day.js 的工厂函数 dayjs(...) 对多种数据类型提供了开箱即用的解析支持。
1. 毫秒级与秒级时间戳
对于常见的 13 位毫秒时间戳,直接传入数值即可;若是 10 位秒级时间戳(Unix 时间戳),可乘以 1000 传入,或使用 dayjs.unix() 方法:
// 13 位毫秒时间戳(例如 1747551000000 对应 2025-05-18)
const msStamp = 1747551000000;
const dateFromMs = dayjs(msStamp).format('YYYYMMDD');
console.log(dateFromMs); // 输出: '20250518'
// 10 位秒级 Unix 时间戳
const secStamp = 1747551000;
const dateFromSec = dayjs(secStamp * 1000).format('YYYYMMDD');
console.log(dateFromSec); // 输出: '20250518'
2. 日期字符串格式重组
若已有格式为 '2025/05/18' 或 '2025-05-18T08:30:00Z',需要去除连字符转为纯数字 '20250518',直接调用解析后格式化即可:
// ISO 8601 字符串转紧凑数字
const isoStr = '2025-05-18T08:30:00.000Z';
const resultStr = dayjs(isoStr).format('YYYYMMDD');
console.log(resultStr); // 输出: '20250518'
四、生产环境防御与时区陷阱排查
生产环境下代码往往面临异常参数或跨国时区差异。如果直接盲目调用 .format(),可能引发隐藏缺陷或边界崩溃。
1. 无效输入与边界校验防护 (isValid)
当传入的值为 null、undefined 或无法被解析的脏数据时,Day.js 默认会返回 'Invalid Date' 字符串。在生成数据库主键或拼接 URL 时,输出 'Invalid Date' 将直接导致下游系统异常。
生产推荐封装一个带有效性判断与兜底值的工具函数:
/**
* 安全格式化日期为 YYYYMMDD
* @param {Date | string | number} date - 输入日期
* @param {string} fallback - 遇到非法日期时的兜底返回值(默认为空字符串)
* @returns {string}
*/
function formatDateToYYYYMMDD(date, fallback = '') {
if (!date) return fallback;
const instance = dayjs(date);
if (!instance.isValid()) {
console.warn('[formatDateToYYYYMMDD] 接收到非法日期参数:', date);
return fallback;
}
return instance.format('YYYYMMDD');
}
// 测试示例
console.log(formatDateToYYYYMMDD('2025-05-18')); // '20250518'
console.log(formatDateToYYYYMMDD(null)); // ''
console.log(formatDateToYYYYMMDD('invalid-str')); // ''
2. 跨时区与 UTC 偏差处理
Day.js 默认使用宿主运行环境的本地时区。如果业务需求要求严格按照 UTC 零时区输出日期(例如跨国财务结算、国际物流跟踪),在东八区晚上 23 点执行与在 UTC 零时区执行,其本地日期相差一天。
此时需引入 Day.js 官方的 utc 插件:
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
// 注册 UTC 插件
dayjs.extend(utc);
// 假设当前北京时间是 2025-05-18 03:00(此时 UTC 时间还是 2025-05-17 19:00)
const targetDate = '2025-05-18T03:00:00+08:00';
// 本地时区格式化(东八区)
console.log(dayjs(targetDate).format('YYYYMMDD')); // '20250518'
// UTC 零时区格式化
console.log(dayjs.utc(targetDate).format('YYYYMMDD')); // '20250517'
五、实战应用场景
将日期转换为 YYYYMMDD 的紧凑格式,在以下三类工程场景中最为普遍:
1. 报表与导出文件动态命名
function generateExportFileName(reportType) {
const dateStr = dayjs().format('YYYYMMDD');
return `${reportType}_${dateStr}.xlsx`;
}
console.log(generateExportFileName('finance_monthly'));
// 输出示例: 'finance_monthly_20250518.xlsx'
2. 业务单据号与流水号前缀
function createOrderSn(sequenceNumber) {
const prefix = 'ORD';
const dateStr = dayjs().format('YYYYMMDD');
const paddedSeq = String(sequenceNumber).padStart(5, '0');
return `${prefix}${dateStr}${paddedSeq}`;
}
console.log(createOrderSn(42));
// 输出示例: 'ORD2025051800042'
六、全文总结
使用 Day.js 将 JavaScript 日期格式化为紧凑的 8 位数字(yyyymmdd 格式)是日常开发中极高频的操作。总结掌握要点如下:
- 核心调用:标准方法为
dayjs(date).format('YYYYMMDD'),无需手动拼接或计算补零。 - 大小写敏感:占位符必须全部大写。
YYYY对应 4 位年份,MM对应 2 位月份,DD对应 2 位日期;切勿混淆小写的mm(分钟)与dd(星期)。 - 输入类型兼容:无参、原生
Date对象、时间戳(毫秒/秒)以及 ISO 日期字符串均可平滑传入。 - 生产防护意识:面对不可控的外部入参,先通过
.isValid()进行有效性校验;面对跨国或统一标准场景,结合dayjs/plugin/utc消除本地时区误差。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。