发布于 2026-01-06 1 阅读
0

date-fns:一个 moment.js 的替代方案

date-fns:一个 moment.js 的替代方案

JavaScript 的 Date 类型真让人头疼!处理基础数据还行,但一旦需要进行更复杂的操作,就得在毫秒(数字)和 Date 类型之间来回转换。这不仅降低了代码的可读性,也让编码变得更加繁琐。

Moment.js曾是我处理所有日期相关事务的首选库。它支持 JavaScript 日期格式转换、时间加减、时区转换等等。Moment.js 虽然也有缺点,但它确实是一个很棒的工具。可惜的是,开发团队宣布 Moment.js 已进入维护模式,并被视为一个遗留项目。这意味着我们只能寻找替代方案了。

最近我开始使用date-fns,感觉很不错!date-fns 是一组用于 JavaScript 日期处理的实用函数。与 moment 不同,date-fns 直接使用 Date 对象,而不会创建新对象来封装日期。
其次,它确实是一组函数。你可以导入所需的函数,并将其与 Date 对象一起使用。没错,你没听错,它开箱即用,支持 tree-shaking!你的生产环境包只会包含你导出和使用的函数。

他们的网站上还提到了一些其他优点,真是太棒了!支持 TypeScript,默认不可变,支持时区,支持国际化和本地化(还支持 tree-shaking!),以及更多其他好东西。

该社区已经相当庞大,拥有 181 位贡献者,其中包括财务贡献者,其中也包括 Addy Osmani。

开始编码!

import { format, formatDistance, formatRelative, subDays } from 'date-fns'

format(new Date(), "'Today is a' iiii")
//=> "Today is a Monday"

formatDistance(subDays(new Date(), 3), new Date())
//=> "3 days ago"

formatRelative(subDays(new Date(), 3), new Date())
//=> "last Friday at 7:26 p.m."
Enter fullscreen mode Exit fullscreen mode

请注意,我们只导入函数,并为它们提供一个普通的 js 日期对象。

使用 moment.js 实现相同功能:

import moment from 'moment';

`Today is a ${moment().format('dddd')}`
//=> "Today is a Monday"

moment().subtract(3, 'days').fromNow()
//=> "3 days ago"

moment().subtract(3, 'days').calendar();
//=> "Last Friday at 7:26 p.m."
Enter fullscreen mode Exit fullscreen mode

这次我们需要导入 moment 函数,它会创建一个包含所有 momentjs 功能的新对象。这意味着不会进行 tree-shaking,我们也不能直接使用 JavaScript 的 date 对象。我们必须先将其转换为 momentjs 对象。

我想这就是你需要知道的全部信息了,你可以去尝试一下,看看你是否喜欢。

PS:
我要由衷地感谢 moment.js 团队!❤️


还有一些可能有趣的帖子


每日为您推送最新最全的编程资讯,每个新标签页都会显示。我们会为您筛选数百个权威信息源,助您洞悉未来。

每日邮报

文章来源:https://dev.to/dailydotdev/date-fns-a-moment-js-alternative-13j0