Day.js格式化当前日期的用法及优势
本文详细讲解如何使用Day.js获取并格式化当前日期,涵盖核心语法、常用占位符、中文本地化与时区扩展,并深入分析Day.js相较于原生Date及Moment.js的技术优势。
dayjs().format('YYYY-MM-DD HH:mm:ss')。不传参数的 dayjs() 会自动捕获系统当前时间戳,配合链式 format 方法即可输出标准化的日期字符串。本文将以该操作为核心,系统梳理常用占位符、中文语言配置及跨时区场景,并深入分析 Day.js 相较于原生 Date API 与 Moment.js 的核心技术优势。
一、格式化当前日期的基础用法
要在项目中使用 Day.js 格式化当前时刻,仅需两个基础步骤:引入库文件并执行链式调用。在不传入任何参数时,dayjs() 默认以当前运行环境的系统时间完成实例化,其底层等效于封装了原生的 new Date()。
1. 依赖安装与引入方式
在基于 npm 或 yarn 的现代工程项目中,可以通过包管理器安装:
# 在终端中执行安装命令
npm install dayjs
在代码中支持 ES Module 与 CommonJS 两种标准模块规范导入:
// ES Module 规范(Vue、React、Vite 项目推荐)
import dayjs from 'dayjs';
// CommonJS 规范(传统 Node.js 服务端)
const dayjs = require('dayjs');
如果是在不需要构建工具的传统 HTML 页面中,可以直接引入 CDN 脚本,全局变量 dayjs 将挂载在 window 对象上:
<!-- 浏览器端通过 CDN 标签直接引入示例 -->
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script>
<script>
console.log(dayjs().format('YYYY-MM-DD'));
</script>
2. 核心调用与常见模板组合
通过向 format() 方法传入包含占位符(Tokens)的模板字符串,可以自由组合年月日、时间与毫秒。若调用 dayjs().format() 而不带参数,默认将输出 ISO 8601 标准格式的时间字符串(如 2026-11-11T02:11:02+08:00)。
// 捕获当前时刻
const now = dayjs();
// 1. 标准年月日
const dateOnly = now.format('YYYY-MM-DD');
// 示例输出:"2026-11-11"
// 2. 年月日及 24 小时制具体时分秒
const fullTime = now.format('YYYY-MM-DD HH:mm:ss');
// 示例输出:"2026-11-11 02:11:02"
// 3. 中文格式表达
const zhDate = now.format('YYYY年MM月DD日 HH时mm分');
// 示例输出:"2026年11月11日 02时11分"
// 4. 精确到毫秒的日志打印格式
const logStamp = now.format('HH:mm:ss.SSS');
// 示例输出:"02:11:02.485"
3. 常用格式化占位符速查
Day.js 解析模板时依赖预定义的占位符。下表列出了日常开发中最常使用的标记项及其格式化规则:
| 占位符 Token | 代表含义 | 规则与取值范围 | 当前时间格式化示例 |
|---|---|---|---|
YYYY |
完整 4 位年份 | 4 位数字 | 2026 |
YY |
简写 2 位年份 | 后 2 位数字 | 26 |
MM |
月份(双位补零) | 01 - 12 | 11 |
M |
月份(不补零) | 1 - 12 | 11 |
DD |
日期(双位补零) | 01 - 31 | 11 |
D |
日期(不补零) | 1 - 31 | 11 |
HH |
24 小时制(双位补零) | 00 - 23 | 02 |
hh |
12 小时制(双位补零) | 01 - 12 | 02 |
mm |
分钟(双位补零) | 00 - 59 | 11 |
ss |
秒数(双位补零) | 00 - 59 | 02 |
SSS |
毫秒数(三位补零) | 000 - 999 | 485 |
d |
星期几(数字) | 0(周日)至 6(周六) | 3 |
Today 中的 Y 和 d,或者 at 中的 a),请使用方括号包裹。例如:dayjs().format('[当前记录时间:] YYYY-MM-DD HH:mm'),方括号内的文字不会被当作占位符解析替换。
二、进阶格式化场景及扩展用法
在真实业务场景中,格式化当前日期往往需要应对星期本土化、国际化时区转换以及友好相对时间等需求。Day.js 采用插件化架构,默认内核仅保留高频功能,其他高级需求均可通过按需挂载插件实现。
1. 中文星期与本地化配置
默认情况下,Day.js 的语言包为英文。如果要使当前日期的星期格式化为“星期三”或“周三”,需要引入中文语言包 dayjs/locale/zh-cn:
import dayjs from 'dayjs';
import 'dayjs/locale/zh-cn'; // 引入中文语言包
// 全局设置语言为中文
dayjs.locale('zh-cn');
// 格式化包含星期的当前时刻
const fullZh = dayjs().format('YYYY年MM月DD日 dddd');
// 示例输出:"2026年11月11日 星期三"
// 使用缩写星期
const shortZh = dayjs().format('YYYY-MM-DD ddd');
// 示例输出:"2026-11-11 周三"
dayjs().locale('zh-cn').format('dddd')。
2. 跨时区当前日期格式化
若你的 Node.js 服务运行在 UTC 时区的容器内,但需要将当前时间以“北京时间(UTC+8)”输出,或者前端用户需要查看纽约时区的当前时间,单靠本地时钟会产生时差。此时需要配合 utc 与 timezone 插件:
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
// 安装插件
dayjs.extend(utc);
dayjs.extend(timezone);
// 格式化指定时区的当前日期
const shanghaiTime = dayjs().tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');
const newYorkTime = dayjs().tz('America/New_York').format('YYYY-MM-DD HH:mm:ss');
// 示例输出:"2026-11-11 02:11:02" 与 对应的纽约时间
三、Day.js 格式化日期的核心技术优势
在 JavaScript 生态中,格式化日期的方案包括原生 Date 对象方法、经典的 Moment.js 以及 date-fns 等。Day.js 之所以成为现代前端和 Node.js 社区的主流首选,源于其在架构设计上的多项关键优势:
1. 极小的体积开销(约 2KB)
早期流行的 Moment.js 包含全部时区和语言解析逻辑,打包后体积接近 300KB(压缩后仍约 70KB),在前端性能要求严格的应用中会显著拉长首屏脚本加载耗时。而 Day.js 的核心库经过极致精炼,Gzip 压缩后仅约 2KB,对移动端网络环境和首屏加载时间几乎零负担。
2. 坚守不可变性(Immutability)设计
原生 JavaScript 的 Date 对象以及 Moment.js 均采用“可变对象(Mutable)”设计。当对一个时间实例进行修改(例如增减天数)时,原实例本身的值会被原地改写,极易在函数传参、组件状态管理中产生难以察觉的隐式副作用:
// 原生 Date 与 Moment.js 的易变陷阱示例
// 在 Moment.js 中:
const today = moment();
const nextWeek = today.add(7, 'day');
// 此时原变量 today 也被修改为 7 天后,导致日期展示全部错乱!
// Day.js 坚守不可变性:
const dayA = dayjs();
const dayB = dayA.add(7, 'day');
// dayA 保持不变,dayB 返回全新的实例,符合函数式纯函数标准
Day.js 在进行任何时间计算或格式化时,均返回全新的实例,彻底杜绝了时间污染与并发调用状态错乱的问题。
3. 与 Moment.js 几乎百分之百兼容的 API
Day.js 在 API 命名、参数签名和占位符定义上与 Moment.js 保持高度一致。团队在重构遗留项目时,往往只需修改导入路径(将 import moment from 'moment' 替换为 import dayjs from 'dayjs'),即可平滑完成数十个业务模块的轻量化迁移,学习与迁移成本几乎为零。
4. 完善的 TypeScript 支持与现代工程化协同
Day.js 源码内建了完备的 TypeScript 类型定义文件,在 IDE 中调用 .format() 时能够获得精准的代码提示与补全。同时支持 Tree-shaking,确保未用到的插件或语言包绝不会打包进最终产物中。
四、避坑指南与排查清单
尽管 Day.js 的 API 极其易懂,但在实际格式化当前日期时,开发者常因输入习惯或大小写混淆踩坑。以下是三项最高频的排查要点:
在模板中,大写
MM 代表月份(01 - 12),而小写 mm 代表分钟(00 - 59)。若将格式字符串写成 YYYY-mm-DD HH:MM:ss,会导致日期中的月份显示为分钟数,时间中的分钟显示为月份,造成严重的逻辑 Bug。记住口诀:大 MM 是月份,小 mm 是分钟。
大写
DD 代表天数(01 - 31),而小写 dd 代表的是星期简写。若误写为 YYYY-MM-dd,将输出类似 2026-11-We 的非预期内容。
大写
HH 代表 24 小时制(00 - 23),小写 hh 代表 12 小时制(01 - 12)。如果在下午两点希望显示为 14:00,必须使用 HH:mm;若写成 hh:mm 则会显示为 02:00,在没有上下午后缀时易造成时间误判。
五、总结
使用 Day.js 格式化当前日期是现代 JavaScript 开发中最优雅、高效的方案。只需牢记 dayjs().format('YYYY-MM-DD HH:mm:ss') 这一核心主线,并注意 MM 与 mm 的大小写规范,即可应对绝大部分常规需求。面对星期本地化、跨时区计算或自定义文案混排,通过搭配 locale 与扩展插件,Day.js 能在保持极低打包体积的同时提供稳健的技术支撑。
在Web编辑器中集成JS HTML格式化功能的实现步骤
2026-11-12 17:55:30
JS动态构建URL参数时的字符串格式化最佳实践
2026-11-12 08:17:27
JS获取UTC时间戳避免时区偏差的方法
2026-11-06 23:08:20
hls.js 常见报错排查:解决 CORS 跨域与 MSE 兼容性问题
2026-11-05 21:12:29
JavaScript三目运算符中的类型隐式转换陷阱与避坑
2026-11-05 20:54:05








