怎么使用Day.js将JS日期格式化为yyyymmdd

作者:工具松鼠

时间:2026-11-12

浏览:173

详细介绍怎么使用轻量级库 Day.js 将 JavaScript 原生日期、时间戳或 ISO 字符串转换为 8 位 yyyymmdd 纯数字格式。涵盖安装引入、核心占位符大小写规范、常见错误排查及生产环境时区防坑实践。

文章目录
分类:前端开发 / JavaScript 实战 主题库:Day.js 格式化 环境要求:Day.js 1.x / Node.js 或现代浏览器
在前端报表导出、订单编号生成或后端接口入参拼接等场景中,经常需要将日期处理为形如 20250518 的 8 位紧凑纯数字字符串(即日常口语中的 yyyymmdd 格式)。在 JavaScript 中使用轻量时间库 Day.js,最直接有效的做法是调用 dayjs(date).format('YYYYMMDD')。但需要格外注意:Day.js 中的格式占位符必须全部大写为 YYYYMMDD,若写成小写的 yyyymmdd,月份会被误解析成分钟,日期会被误解析为星期缩写。本文将从安装引入、占位符语法、多数据源解析及边界时区防护四个方面,系统讲解如何规范完成这一格式化操作。
怎么使用Day.js将JS日期格式化为yyyymmdd
图 0:Day.js 将 JavaScript 日期转换为 8 位紧凑纯数字格式速查概览

一、核心语法与占位符规范

日常业务交流中大家习惯将“年月日”简写为 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将JS日期格式化为yyyymmdd
图 1:Day.js 格式化占位符大小写对照与映射原理

二、环境依赖接入与项目引入

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>
怎么使用Day.js将JS日期格式化为yyyymmdd
图 2:Day.js 日期格式化四步操作流程与执行链路

三、多数据源解析:原生 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'
怎么使用Day.js将JS日期格式化为yyyymmdd
图 3:生产环境日期格式化防御与分支决策树

五、实战应用场景

将日期转换为 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将JS日期格式化为yyyymmdd
图 4:Day.js 格式化 yyyymmdd 核心要点全景总结

六、全文总结

使用 Day.js 将 JavaScript 日期格式化为紧凑的 8 位数字(yyyymmdd 格式)是日常开发中极高频的操作。总结掌握要点如下:

  1. 核心调用:标准方法为 dayjs(date).format('YYYYMMDD'),无需手动拼接或计算补零。
  2. 大小写敏感:占位符必须全部大写。YYYY 对应 4 位年份,MM 对应 2 位月份,DD 对应 2 位日期;切勿混淆小写的 mm(分钟)与 dd(星期)。
  3. 输入类型兼容:无参、原生 Date 对象、时间戳(毫秒/秒)以及 ISO 日期字符串均可平滑传入。
  4. 生产防护意识:面对不可控的外部入参,先通过 .isValid() 进行有效性校验;面对跨国或统一标准场景,结合 dayjs/plugin/utc 消除本地时区误差。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章