date-fns 现代 JavaScript 日期实用程序库(基础篇)上

date-fns 现代 JavaScript 日期实用程序库(基础篇) 上
文章目录
- date-fns 现代 JavaScript 日期实用程序库(基础篇) 上
- 一、前言
- 二、开始使用
- 2.1 扩展:版本核心差异概览
- 三、日期格式化
- 3.1 基础使用
- 3.2 格式化日期辅助函数封装
- 3.3 扩展:世界语言与语法格
- 3.4 扩张:格式模板对照表
- 四、头尾日期快速定位
- 4.1 起始日期获取
- 4.2 结束日期获取
- 六、参考资料💘
- 七、推荐博文🍗
一、前言
若是要从 JavaScript 前端的日期处理包中推荐一个,博主会毫不犹豫的首推 date-fns,与 DayJs 对比,date-fns 功能更强大,使用起来更方便
date-fns使用原生的 Date 类型进行操作,它不会扩展核心 Date 对象。这意味着能够直接编写日期处理代码,同时也不需要学习特定的封装类型。- I18n国际化支持十分完善,在令人惊叹的社区的支持下,date-fns 拥有数十个区域设置。只有您使用的项目才会包含在您的项目中。
- 对于使用 TypeScript 编写的项目,
date-fns完美支持 TypeScript 类型推断,其源码本身就是使用 TypeScript 编写,当然这并不意味着一定要用于 TypeScript 项目上,对于不使用 TypeScript 的项目,也能通过 IDE 获取完美的语法提示和代码补全。 - 截止到 2025年10月,
date-fns在 npmjs 发布的第一个版本到现在的最新版本,已有超过 11 年的时间,周下载量在 35,098,230 次左右,可以说这也是一个很老牌的依赖,伙计们放心用就行。
| 特性 | Moment.js | dayjs | date-fns |
|---|---|---|---|
| 包大小 | 67.8KB (完整) | 2.3KB (核心) | 动态构建输出,最小 1KB 不到,最大 80KB (完整) |
| 按需加载 | ❌ | ✅(插件系统) | ✅(模块化) |
| 不可变性 | ❌ (默认可变) | ✅ | ✅ |
| API风格 | 链式调用 | 链式调用 | 函数式 |
| 性能 | ⚠️ 较慢 | ⚠️ 中等 | ✅ 快 |
| 时区支持 | 需插件(moment-timezone) | 需插件 | 需使用 date-fns-tz 依赖 |
| Tree-shaking | ❌ | ⚠️ 有限 | ✅ |
| 维护状态 | ❌ (已停止维护) | ✅ 活跃 | ✅ 活跃 |
| 国际化 | ✅ (内置) | ✅ (插件) | ✅ (按需加载locale) |
| 周起始配置 | 全局配置 | 全局配置 | 按调用配置 |
二、开始使用
# 最新版本获取👇
npm i date-fns
# or
yarn add date-fns
# or
pnpm add date-fns# NodeJs 16\14
yarn add date-fns@^2.30.0
官网文档中并没有明确写明各版本与 NodeJs 的兼容性,甚至在 NPM 官网包信息里也并没有对应 engine 表示最低 NodeJs 版本,这也是很多人在开始使用 date-fns时就遇到本地开发环境的 NodeJs 版本与 date-fns不兼容报错,再加上 date-fns 在国内比较正式的中文文档难以寻找,这就导致很多人难以发现或则一开始就放弃使用的原因。
经过博主查阅各版本的 date-fns 依赖性信息以及的不同版本的安装测试,为大伙提供各版本 date-fns与 NodeJs 版本兼容性表,咱可以通过此对照表安装适合项目所依赖的 NodeJs 版本,对于 NodeJs 14 以下的版本并不纳入检测范围,建议使用项目中原有处理日期时间依赖。
| NodeJs 版本 | NodeJs 14 | NodeJs 16 | NodeJs 18 | NodeJs >= 20 |
|---|---|---|---|---|
| date-fns 版本 | ^2.30.0✅ | ^2.30.0✅ | ^2.30.0✅ ^3.6.0✅ ^4.1.0✅ | ^2.30.0✅ ^3.6.0✅ ^4.1.0✅ |
若Node版本不符合要求,且存在切换 Node 版本的需求,可以参考:NVM NodeJs版本管理 通关宝典
在最新版本的 date-fns 里,某些模块工具会比旧版本多出一些扩展参数,但与旧版本的用法兼容,这些扩展参数用上的可能性较低,因此博文内不会特别讲解这些新特性参数,尽量以简单实用为主。
2.1 扩展:版本核心差异概览
| 维度 | v1.x | v2.x | v3.x | v4.x |
|---|---|---|---|---|
| 发布时间 | 2017年前 | 2018-2022 | 2023-2024 | 2024至今 |
| Node.js 最低要求 | ≥6.0 | ≥8.0 | ≥14.0 | ≥16.8 |
| 包体积 (gzip) | ≈80KB | ≈60KB | ≈45KB | ≈35KB |
| Tree Shaking 支持 | 有限 | ✅ 优化 | ✅ 增强 | ✅极致优化 |
| 函数式编程支持 | ❌ 无 | ✅ fp 子模块 | ✅ 增强 | ✅完整柯里化 |
| 时区处理 | 需 date-fns-tz</font> | 需 date-fns-tz</font> | 部分内置 | ✅原生强化 |
v2.x 里程碑
- 模块化革命:每个函数独立导出。
- 国际化内置:支持 50+ 语言环境(
import { es } from 'date-fns/locale')。 - FP 子模块:提供柯里化函数(
date-fns/fp)。
v3.x 突破
- TypeScript 深度集成:类型覆盖率 100%。
- 破坏性变更:
- 格式化符号统一小写(
YYYY->yyyy)。 - 时区函数部分移至核心库(如
zonedTimeToUtc)。
- 格式化符号统一小写(
- 新增
formatDistanceStrict等 20+ 函数。
v4.x 现代化升级
- API 重构,但并没有特别破坏性的改动,大多数只是简单调换了顺序或增加了新的候补参数:
// v3: add(date, amount) → v4: add(amount, date)
addDays(new Date(), 7); // v4 报错❌
addDays(7, new Date()); // v4 正确✅
- Temporal API 实验性支持:
import { toTemporalInstant } from "date-fns-temporal";
const temporalDate = toTemporalInstant(new Date());
- 时区计算增强:无需
date-fns-tz处理夏令时。 - ECMAScript 2021 语法:空值合并 (
??)、逻辑赋值等。
⚡ 性能对比(常见操作 ops/s,Node.js 20 环境)
以下为部分 liunx 测试脚本以及 AI 问答结果,不一定准确但可以进行大致的简单参考。
| 操作 | v2.30 | v3.3 | v4.0 | 提升幅度 |
|---|---|---|---|---|
format()</font> | 142k | 163k | 192k | ↑18% |
addDays()</font> | 342k | 385k | 462k | ↑20% |
isWithinInterval()</font> | 210k | 280k | 315k | ↑50% |
| 时区转换 | 85k | 102k | 135k | ↑32% |
三、日期格式化
咱们之所以使用日期处理包,日期格式化这个功能占了很大的原因,可以不用其他与日期相关的功能,但一定不能没有格式化,date-fns 的格式化功能十分强大,模板基于 Unicode Locale Data Markup Language (LDML) Part 4: Dates 标准,并扩展了一些内容。
3.1 基础使用
import { format } from "date-fns";// ISO 8601 标准格式
console.log("ISO 8601 标准格式", format(new Date(), "yyyy-MM-dd'T'HH:mm:ss.SSS'Z"));// 简洁日期格式
console.log("yyyyMMdd", format(new Date(), "yyyyMMdd"));// yyyy-MM-dd HH:mm:ss
console.log("yyyy-MM-dd HH:mm:ss", format(new Date(), "yyyy-MM-dd HH:mm:ss"));
console.log("yyyy-MM-dd HH:mm:ss", format(new Date(2000, 22, 2, 2, 2), "yyyy-MM-dd HH:mm:ss"));// IOS 兼容格式
console.log("yyyy/MM/dd HH:mm:ss", format(new Date(), "yyyy/MM/dd HH:mm:ss"));
console.log("yyyy/MM/dd HH:mm:ss", format(new Date(2000, 22, 2, 2, 2), "yyyy/MM/dd HH:mm:ss"));// 12小时制时间
console.log("hh:mm:ss a", format(new Date(), "hh:mm:ss a"));// 毫秒级时间
console.log("yyyy-MM-dd HH:mm:ss", format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));// 文件命名友好格式
console.log("yyyy_MM_dd_HH_mm_ss", format(new Date(), "yyyy_MM_dd_HH_mm_ss"));// 美式日期格式
console.log("MM/dd/yyyy", format(new Date(), "MM/dd/yyyy"));// 欧式日期格式
console.log("dd/MM/yyyy", format(new Date(), "dd/MM/yyyy"));// 单引号防转义字符标识
// -> yyyyMMdd
console.log("yyyyMMdd", format(new Date(), "'yyyyMMdd'"));
3.2 格式化日期辅助函数封装
import { format } from "date-fns";/*** 格式化日期辅助函数* @param date 日期* @param options 格式化参数*/
export function formatDate(date: string | Date, options: string | { pattern?: string; def?: string } = {}) {if (typeof options === "string") {options = { pattern: options }}options = Object.assign({ pattern: "yyyy-MM-dd HH:mm:ss", def: "--" }, options)try {if (!(date instanceof Date)) {date = new Date(date)}return format(date, options.pattern!)} catch {return options.def}
}
3.3 扩展:世界语言与语法格
由于中文没有语法格变化,大部分人都是对语法格感到十分的陌生,如果你是一名会外语的高手,恰巧你会的语言之中存在语法格,那么你一定明白语法格是什么,或是熟悉编写国际化代码的小伙伴,或多或少也了解过语法格这个东西。
本文针对于在编程上使用日期格式化的扩展知识章节,可以简单讲语法格的使用概叙为一句话:某些语言在描述单独一个日期单位和一个完整日期时存在语法上的差别。
| 语法格 | 定义 | 功能 |
|---|---|---|
| 主格 (Nominative Case) | 表示动作的执行者或事物的主体 | 1. 作为句子的主语 2. 作为谓语的表语 3. 独立存在时使用 |
| 属格 (Genitive Case) | 表示所属关系或修饰关系 | 1. 表示所有关系(“的”) 2. 表示部分关系 3. 作为其他词的修饰语 |
咱接着往下讲,拿中文和**俄语**举例,中文里可以这么去描述时间“2022年10月24日” 和 “10月”,但在俄文里就需要这么去写了“24 октября 2022 года”和“Октябрь”仔细看,对于月这个词是存在差异的。
中文与俄语月份对照表
| 月份 | 中文 | 俄语主格 | 俄语属格 | 发音(主格→属格) |
|---|---|---|---|---|
| 1月 | 一月 | Январь | января | [jan-vár’] → [yan-var-yá] |
| 2月 | 二月 | Февраль | февраля | [fev-rál’] → [fev-ral-yá] |
| 3月 | 三月 | Март | марта | [mart] → [már-ta] |
| 4月 | 四月 | Апрель | апреля | [ap-rél’] → [ap-rel-yá] |
| 5月 | 五月 | Май | мая | [maj] → [ma-yá] |
| 6月 | 六月 | Июнь | июня | [i-yún’] → [i-yun-á] |
| 7月 | 七月 | Июль | июля | [i-yúl’] → [i-yul-yá] |
| 8月 | 八月 | Август | августа | [av-gust] → [av-gus-ta] |
| 9月 | 九月 | Сентябрь | сентября | [sen-tyábr’] → [sen-tyab-ryá] |
| 10月 | 十月 | Октябрь | октября | [ak-tyábr’] → [ak-tyab-ryá] |
| 11月 | 十一月 | Ноябрь | ноября | [na-yábr’] → [na-yab-ryá] |
| 12月 | 十二月 | Декабрь | декабря | [de-kábr’] → [de-kab-ryá] |
虽然现代中文没有格变化,但古汉语曾有类似机制。
| 古汉语结构 | 功能 | 现代对应 |
|---|---|---|
| “吾”(主格) | 主语 | 我 |
| “我”(属格) | 所有 | 我的 |
| “之”(属格标记) | 所属 | 的 |
| “乎”(与格) | 间接宾语 | 给/对 |
- 古:“吾爱之书”(主格+属格)
- 今:“我爱的书”(无格变化)
3.4 扩张:格式模板对照表
部分格式需要配合国际化使用,否则将显示默认的英文。
| 单位 | 模板 | 结果示例 | 备注 |
|---|---|---|---|
| 纪元(Era) | G…GGG | AD, BC | |
| GGGG | Anno Domini, Before Christ | ||
| GGGGG | A, B | ||
| 日历年(Calendar year) | y | 44, 1, 1900, 2017 | |
| yo | 44th, 1st, 0th, 17th | ||
| yy | 44, 01, 00, 17 | ||
| yyy | 044, 001, 1900, 2017 | ||
| yyyy | 0044, 0001, 1900, 2017 | ||
| yyyyy | … | ||
| 本地周编号年份(Local week-numbering year) | Y | 44, 1, 1900, 2017 | |
| Yo | 44th, 1st, 1900th, 2017th | ||
| YY | 44, 01, 00, 17 | ||
| YYY | 044, 001, 1900, 2017 | ||
| YYYY | 0044, 0001, 1900, 2017 | ||
| YYYYY | … | ||
| ISO 标准 周编号年份(ISO week-numbering year) | R | -43, 0, 1, 1900, 2017 | ISO 8601 标准日期格式 |
| RR | -43, 00, 01, 1900, 2017 | ||
| RRR | -043, 000, 001, 1900, 2017 | ||
| RRRR | -0043, 0000, 0001, 1900, 2017 | ||
| RRRRR | … | ||
| 扩展年份(Extended year) | u | -43, 0, 1, 1900, 2017 | ISO 8601标准中定义的日期表示法,用于表示超出常规年份范围(0000-9999)的日期,主要处理: 1. 公元前的年份(BCE,如公元前1000年) 2. 超大年份(如公元10000年) 3. 科学和天文学领域需要表示的极远时间点 |
| uu | -43, 01, 1900, 2017 | ||
| uuu | -043, 001, 1900, 2017 | ||
| uuuu | -0043, 0001, 1900, 2017 | ||
| uuuuu | … | ||
| 季度(Quarter) | Q | 1, 2, 3, 4 | |
| Qo | 1st, 2nd, 3rd, 4th | ||
| 01, 02, 03, 04 | |||
| QQQ | Q1, Q2, Q3, Q4 | ||
| QQQQ | Q1, Q2, Q3, Q4 | ||
| QQQQQ | 1, 2, 3, 4 | ||
| 季度主格(Quarter)(stand-alone) | q | 1, 2, 3, 4 | 主格语法,详情参考:3.3 扩展:世界语言与语法格 |
| qo | 1st, 2nd, 3rd, 4th | ||
| 01, 02, 03, 04 | |||
| qqq | Q1, Q2, Q3, Q4 | ||
| qqqq | 1st quarter, 2nd quarter, … | ||
| qqqqq | 1, 2, 3, 4 | ||
| 月度(Month) | M | 1, 2, …, 12 | |
| Mo | 1st, 2nd, …, 12th | ||
| MM | 01, 02, …, 12 | ||
| MMM | Jan, Feb, …, Dec | ||
| MMMM | January, February, …, December | ||
| MMMMM | J, F, …, D | ||
| 月度主格 (Month)(stand-alone) | L | 1, 2, …, 12 | 主格语法,详情参考:3.3 扩展:世界语言与语法格 |
| Lo | 1st, 2nd, …, 12th | ||
| LL | 01, 02, …, 12 | ||
| LLL | Jan, Feb, …, Dec | ||
| LLLL | January, February, …, December | ||
| LLLLL | J, F, …, D | ||
| 本地今年中的第几个星期(Local week of year) | w | 1, 2, …, 53 | |
| wo | 1st, 2nd, …, 53th | ||
| ww | 01, 02, …, 53 | ||
| ISO 标准 今年中的第几个星期(ISO week of year) | I | 1, 2, …, 53 | |
| Io | 1st, 2nd, …, 53th | ||
| II | 01, 02, …, 53 | ||
| 这个月的第几天(Day of month) | d | 1, 2, …, 31 | |
| do | 1st, 2nd, …, 31st | ||
| dd | 01, 02, …, 31 | ||
| 今年的第几天(Day of year) | D | 1, 2, …, 365, 366 | |
| Do | 1st, 2nd, …, 365th, 366th | ||
| DD | 01, 02, …, 365, 366 | ||
| DDD | 001, 002, …, 365, 366 | ||
| DDDD | … | ||
| 这个星期的第几天(Day of week) | E…EEE | Mon, Tue, Wed, …, Sun | |
| EEEE | Monday, Tuesday, …, Sunday | ||
| EEEEE | M, T, W, T, F, S, S | ||
| EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | ||
| ISO 标准 这个星期的第几天(ISO day of week) | i | 1, 2, 3, …, 7 | |
| io | 1st, 2nd, …, 7th | ||
| ii | 01, 02, …, 07 | ||
| iii | Mon, Tue, Wed, …, Sun | ||
| iiii | Monday, Tuesday, …, Sunday | ||
| iiiii | M, T, W, T, F, S, S | ||
| iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | ||
| 本地星期的第几天(Local day of week) | e | 2, 3, 4, …, 1 | |
| eo | 2nd, 3rd, …, 1st | ||
| ee | 02, 03, …, 01 | ||
| eee | Mon, Tue, Wed, …, Sun | ||
| eeee | Monday, Tuesday, …, Sunday | ||
| eeeee | M, T, W, T, F, S, S | ||
| eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | ||
| 本地星期的第几天主格(Local day of week )(stand-alone) | c | 2, 3, 4, …, 1 | 主格语法,详情参考:3.3 扩展:世界语言与语法格 |
| co | 2nd, 3rd, …, 1st | ||
| cc | 02, 03, …, 01 | ||
| ccc | Mon, Tue, Wed, …, Sun | ||
| cccc | Monday, Tuesday, …, Sunday | ||
| ccccc | M, T, W, T, F, S, S | ||
| cccccc | Mo, Tu, We, Th, Fr, Sa, Su | ||
| 上午,下午 (AM, PM) | a…aa | AM, PM | |
| aaa | am, pm | ||
| aaaa | a.m., p.m. | ||
| aaaaa | a, p | ||
| 上午,下午,正午,午夜(AM, PM, noon, midnight) | b…bb | AM, PM, noon, midnight | |
| bbb | am, pm, noon, midnight | ||
| bbbb | a.m., p.m., noon, midnight | ||
| bbbbb | a, p, n, mi | ||
| 弹性工作日(Flexible day period) | B…BBB | at night, in the morning, … | |
| BBBB | at night, in the morning, … | ||
| BBBBB | at night, in the morning, … | ||
| 小时(Hour 1-12) | h | 1, 2, …, 11, 12 | |
| ho | 1st, 2nd, …, 11th, 12th | ||
| hh | 01, 02, …, 11, 12 | ||
| 小时(Hour 0-23) | H | 0, 1, 2, …, 23 | |
| Ho | 0th, 1st, 2nd, …, 23rd | ||
| HH | 00, 01, 02, …, 23 | ||
| 小时(Hour 0-11) | K | 1, 2, …, 11, 0 | |
| Ko | 1st, 2nd, …, 11th, 0th | ||
| KK | 01, 02, …, 11, 00 | ||
| 小时(Hour 1-24) | k | 24, 1, 2, …, 23 | |
| ko | 24th, 1st, 2nd, …, 23rd | ||
| kk | 24, 01, 02, …, 23 | ||
| 分钟(Minute) | m | 0, 1, …, 59 | |
| mo | 0th, 1st, …, 59th | ||
| mm | 00, 01, …, 59 | ||
| 秒(Second) | s | 0, 1, …, 59 | |
| so | 0th, 1st, …, 59th | ||
| ss | 00, 01, …, 59 | ||
| 毫秒(Fraction of second) | S | 0, 1, …, 9 | |
| SS | 00, 01, …, 99 | ||
| SSS | 000, 001, …, 999 | ||
| SSSS | … | ||
| 时区 Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |
| XX | -0800, +0530, Z | ||
| XXX | -08:00, +05:30, Z | ||
| XXXX | -0800, +0530, Z, +123456 | ||
| XXXXX | -08:00, +05:30, Z, +12:34:56 | ||
| 时区 Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |
| xx | -0800, +0530, +0000 | ||
| xxx | -08:00, +05:30, +00:00 | ||
| xxxx | -0800, +0530, +0000, +123456 | ||
| xxxxx | -08:00, +05:30, +00:00, +12:34:56 | ||
| 时区 Timezone (GMT) | O…OOO | GMT-8, GMT+5:30, GMT+0 | |
| OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | ||
| 时区 Timezone (specific non-locat.) | z…zzz | GMT-8, GMT+5:30, GMT+0 | |
| zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | ||
| 秒的时间戳(Seconds timestamp) | t | 512969520 | |
| tt | … | ||
| 毫秒级时间戳(Milliseconds timestamp) | T | 512969520900 | |
| TT | … | ||
| 长格式本地化日期(Long localized date) | P | 04/29/1453 | |
| PP | Apr 29, 1453 | ||
| PPP | April 29th, 1453 | ||
| PPPP | Friday, April 29th, 1453 | ||
| 长时间的本地化(Long localized time) | p | 12:00 AM | |
| pp | 12:00:00 AM | ||
| ppp | 12:00:00 AM GMT+2 | ||
| pppp | 12:00:00 AM GMT+02:00 | ||
| 日期与时间的组合(Combination of date and time) | Pp | 04/29/1453, 12:00 AM | |
| PPpp | Apr 29, 1453, 12:00:00 AM | ||
| PPPppp | April 29th, 1453 at … | ||
| PPPPpppp | Friday, April 29th, 1453 at … |
四、头尾日期快速定位
date-fns 实现头尾日期快速定位也十分方便,由于是使用引入模块的方式,与 dayjs 对比,最大的好处就是不用记住具体的字符串参数就能直接使用,同时会返回一个新的对象而不会修改之前的日期和拥有更多的精度支持,以下是具体对比表,感兴趣的可以自行看看👇
| 功能 | Day.js | date-fns |
|---|---|---|
| 月份首尾 | .startOf('month').endOf('month') | startOfMonth(date)endOfMonth(date) |
| 周首尾(可配起始) | .startOf('week').endOf('week')(默认周日,可配置) | startOfWeek(date, {weekStartsOn: 1})endOfWeek(date, {weekStartsOn: 1}) |
| 季度首尾 | .startOf('quarter').endOf('quarter') | startOfQuarter(date)endOfQuarter(date) |
| 年度首尾 | .startOf('year').endOf('year') | startOfYear(date)endOfYear(date) |
| 时分秒首尾 | .startOf('hour').endOf('minute') | startOfHour(date)endOfMinute(date) |
| 链式调用 | ✅ 支持完整链式操作 | ❌ 需嵌套或变量存储 |
| 不可变性 | ❌ 默认可变(需.clone()) | ✅ 所有函数返回新对象 |
| 周起始日配置 | 全局设置:dayjs.extend(weekOfYear) | 每次调用时作为选项参数传递 |
| 时间精度控制 | ⚠️ 需插件支持 | ✅ 内置支持(如endOfToday()) |
| ISO 周支持 | 需插件:dayjs.extend(isoWeek) | ✅ 内置:startOfISOWeek(date) |
4.1 起始日期获取
基础方法
| 方法名 | 参数 | 描述 |
|---|---|---|
| startOfSecond | (date: Date) => Date | 返回给定日期的秒开始时刻 |
| startOfMinute | (date: Date) => Date | 返回给定日期的分钟开始时刻 |
| startOfHour | (date: Date) => Date | 返回给定日期的小时开始时刻 |
| startOfDay | (date: Date) => Date | 返回给定日期的天开始时刻 |
| startOfWeek | (date: Date) => Date | 返回给定日期的周开始时刻 |
| startOfMonth | (date: Date) => Date | 返回给定日期的月开始时刻 |
| startOfYear | (date: Date) => Date | 返回给定日期的年开始时刻 |
import { format, startOfSecond, startOfMinute, startOfHour,startOfDay, startOfWeek, startOfMonth, startOfYear } from "date-fns";function print(date: Date) {console.log(format(date, "yyyy-MM-dd HH:mm:ss.SSS"));
}console.group("date-fns起始日期获取示例 基础方法");// 当前时间,与下列示例对比
// -> 2025-10-21 15:10:25.317
print(new Date());// 返回给定日期的秒开始时刻
// -> 2025-10-21 15:10:25.000
print(startOfSecond(new Date()));// 返回给定日期的分钟开始时刻
// -> 2025-10-21 15:10:00.000
print(startOfMinute(new Date()));// 返回给定日期的小时开始时刻
// -> 2025-10-21 15:00:00.000
print(startOfHour(new Date()));// 返回给定日期的天开始时刻
// -> 2025-10-21 00:00:00.000
print(startOfDay(new Date()));// 返回给定日期的周开始时刻
// -> 2025-10-19 00:00:00.000
print(startOfWeek(new Date()));// 返回给定日期的月开始时刻
// -> 2025-10-01 00:00:00.000
print(startOfMonth(new Date()));// 返回给定日期的年开始时刻
// -> 2025-01-01 00:00:00.000
print(startOfYear(new Date()));console.groupEnd();
扩展方法
| 方法名 | 参数 | 描述 |
|---|---|---|
| startOfToday | () => Date | 返回当天的开始时刻 |
| startOfTomorrow | () => Date | 返回明天的开始时刻 |
| startOfYesterday | () => Date | 返回昨天的开始时刻 |
| startOfQuarter | (date: Date) => Date | 返回给定日期当前季度的开始时刻 |
| startOfDecade | (date: Date) => Date | 返回给定日期十年内的开始时刻 |
import { format, startOfToday, startOfTomorrow, startOfYesterday, startOfQuarter, startOfDecade } from "date-fns";function print(date: Date) {console.log(format(date, "yyyy-MM-dd HH:mm:ss.SSS"));
}console.group("date-fns起始日期获取示例 扩展方法");// 当前时间,与下列示例对比
// -> 2025-10-21 15:28:00.569
print(new Date());// 返回当天的开始时刻
// -> 2025-10-21 00:00:00.000
print(startOfToday());// 返回明天的开始时刻
// -> 2025-10-22 00:00:00.000
print(startOfTomorrow());// 返回昨天的开始时刻
// -> 2025-10-20 00:00:00.000
print(startOfYesterday());// 返回给定日期当前季度的开始时刻
// -> 2025-10-01 00:00:00.000
print(startOfQuarter(new Date()));// 返回给定日期十年内的开始时刻
// -> 2020-01-01 00:00:00.000
print(startOfDecade(new Date()));console.groupEnd();
4.2 结束日期获取
基础方法
| 方法名 | 参数 | 描述 |
|---|---|---|
| endOfSecond | (date: Date) => Date | 返回给定日期的秒开始时刻 |
| endOfMinute | (date: Date) => Date | 返回给定日期的分钟开始时刻 |
| endOfHour | (date: Date) => Date | 返回给定日期的小时开始时刻 |
| endOfDay | (date: Date) => Date | 返回给定日期的天开始时刻 |
| endOfWeek | (date: Date) => Date | 返回给定日期的天开始时刻 |
| endOfMonth | (date: Date) => Date | 返回给定日期的月开始时刻 |
| endOfYear | (date: Date) => Date | 返回给定日期的年开始时刻 |
import { format, endOfSecond, endOfMinute, endOfHour, endOfDay, endOfWeek, endOfMonth, endOfYear } from "date-fns";function print(date: Date) {console.log(format(date, "yyyy-MM-dd HH:mm:ss.SSS"));
}console.group("date-fns结束日期获取示例 基础方法");// 当前时间,与下列示例对比
// -> 2025-10-21 16:39:11.253
print(new Date());// 返回给定日期的秒开始时刻
// -> 2025-10-21 16:39:11.999
print(endOfSecond(new Date()));// 返回给定日期的分钟开始时刻
// -> 2025-10-21 16:39:59.999
print(endOfMinute(new Date()));// 返回给定日期的小时开始时刻
// -> 2025-10-21 16:59:59.999
print(endOfHour(new Date()));// 返回给定日期的天开始时刻
// -> 2025-10-21 23:59:59.999
print(endOfDay(new Date()));// 返回给定日期的周开始时刻
// -> 2025-10-25 23:59:59.999
print(endOfWeek(new Date()));// 返回给定日期的月开始时刻
// -> 2025-10-31 23:59:59.999
print(endOfMonth(new Date()));// 返回给定日期的年开始时刻
// -> 2025-12-31 23:59:59.999
print(endOfYear(new Date()));console.groupEnd();
扩展精度方法
| 方法名 | 参数 | 描述 |
|---|---|---|
| endOfToday | () => Date | 返回当天的开始时刻 |
| endOfTomorrow | () => Date | 返回明天的开始时刻 |
| endOfYesterday | () => Date | 返回昨天的开始时刻 |
| endOfQuarter | (date: Date) => Date | 返回给定日期当前季度的开始时刻 |
| endOfDecade | (date: Date) => Date | 返回给定日期十年内的开始时刻 |
import { format, endOfToday, endOfTomorrow, endOfYesterday, endOfQuarter, endOfDecade} from "date-fns";function print(date: Date) {console.log(format(date, "yyyy-MM-dd HH:mm:ss.SSS"));
}console.group("date-fns结束日期获取示例 扩展方法");// 当前时间,与下列示例对比
// -> 2025-10-21 16:45:28.586
print(new Date());// 返回当天的开始时刻
// -> 2025-10-21 23:59:59.999
print(endOfToday());// 返回明天的开始时刻
// -> 2025-10-22 23:59:59.999
print(endOfTomorrow());// 返回昨天的开始时刻
// -> 2025-10-20 23:59:59.999
print(endOfYesterday());// 返回给定日期当前季度的开始时刻
// -> 2025-12-31 23:59:59.999
print(endOfQuarter(new Date()));// 返回给定日期十年内的开始时刻
// -> 2029-12-31 23:59:59.999
print(endOfDecade(new Date()));console.groupEnd();
六、参考资料💘
- 官方手册:
- Modern JavaScript Date Utility Library
- 包依赖地址:
- GitHub - date-fns/date-fns: ⏳ Modern JavaScript date utility library ⌛️
- npm date-fns
七、推荐博文🍗
-
date-fns 现代 JavaScript 日期实用程序库(高级篇) 下
-
NVM NodeJs版本管理 通关宝典
-
『精』Sass 核心程序设计指南(这一篇就够了!)
