使用 date-fns 格式化和修改 JavaScript 日期
为什么需要 date-fns?
入门
格式化
添加区域设置
加法和减法
计算两个日期之间的天数
结论
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
在 JavaScript 中操作日期似乎是一项艰巨的任务。原生Date()对象对新手不太友好,即使是格式化这样简单的任务也需要大量的工作。
目前,JavaScript 日期管理库领域主要有两个竞争对手:MomentJS和Date-FNS。
为什么需要 date-fns?
这两个库都能完成任务,它们允许你获取Date对象并进行格式化、添加时间、减去时间等等。然而,两者之间存在一个明显的核心区别,这可能会成为你未来项目中的一个卖点。
Date-fns 采用模块化设计,这意味着您只需导入所需功能,从而避免最终打包的文件体积过大。这看似无关紧要,但如果您仅仅为了一个简单的格式化函数而导入整个 MomentJS 库,那就未必是您想要的了。
它还是不可变的,这意味着对于每个函数,你总是会得到一个新 Date对象。这使得调试变得轻而易举。
文档非常清晰简洁,每个函数都有明确的使用示例。您可以在这里查看:date-fns文档。
入门
让我们直接进入正题,将 date-fns 导入到一个入门项目中。
# If you use NPM
npm install date-fns
# If you use YARN
yarn add date-fns
注意:如果您正在阅读本文并且不想使用包管理器,您可以导入整个库,<script src="http://cdn.date-fns.org/VERSION/date_fns.min.js"></script>但您将无法只导入您想要/需要的模块。
另外,请记住,当通过在线编辑器(例如 .txt 文件)使用date-fns时,您需要通过对象来调用函数,而不是像本文中那样直接调用函数。 例如:<script>CodeSandboxdateFnsdateFns.addDays()
将库添加到项目后,就可以转到 JavaScript 文件并开始导入函数了!
格式化
在使用 JavaScript 处理日期时,格式化是必不可少的,所以我们首先要解决这个问题。
format通过调用以下代码将函数导入到您的文件中:
import { format } from 'date-fns';
或者,如果您正在开发一个 NodeJS 项目:
const { format } = require('date-fns');
提示:如果您还不知道,导入括号之间的部分允许我们只将函数{ format }导入到您的文件中,因此您实际上只引入此文件将使用的函数!format
让我们创建一个新的日期来使用:const newYears = new Date(2019, 1, 1);,这将给我们一个常量,newYears其中包含 2019 年 1 月 1 日的原生 JS 日期。
现在让我们把这个日期格式化为 MM/DD/YYYY 格式。
const newYears = new Date('2019/01/01');
const formattedDate = format(newYears, 'MM/DD/YYYY');
console.log(formattedDate);
运行此命令并查看控制台输出,您会发现已返回格式化的字符串。01/01/2019
等等,就这些?没错!Date-fns 让格式化变得超级简单!
如果您想查看不同的格式化选项,请查看format 函数的官方文档以获取完整参考。
添加区域设置
好的,格式化是一项非常简单的任务。但date-fns还支持一种简单的方法来本地化格式化后的日期输出。
让我们沿用之前的例子,并将其更改为法语语言环境,采用完整的月份名称格式。我们只需要指定require语言环境,并将其传递给 format 选项。该选项接受一个可选的第三个参数,用于指定选项对象。
const newYears = new Date('2019/01/01');
const frenchLocale = require('date-fns/locale/fr');
const formattedDate = format(newYears, 'MMMM DD, YYYY', { locale: frenchLocale });
console.log(formattedDate);
太好了!现在的输出是janvier 01, 2019
加法和减法
现在我们知道了如何格式化日期,接下来让我们实际操作一下初始日期。
我们date-fns为每种类型的操作都编写了一个函数:
看出规律了吗?这里有很多加减运算函数可以使用。务必前往文档查看所有可用函数!
让我们沿用之前的例子,并加上一年,这样我们就以 2020 年为起点。
首先,将该函数添加addYears到我们的导入语句中。
import { format, addYears } from 'date-fns';
现在我们已经可以使用该函数了,我们可以将一年添加到基准日期,然后格式化输出。
let newYears = new Date('2019/01/01');
newYears = addYears(newYears, 1);
const formattedDate = format(newYears, 'MMMM DD, YYYY');
console.log(formattedDate);
现在的输出应该是:January 01, 2020
计算两个日期之间的天数
再来一个?这次我们来计算一下从新年第一天到圣诞节之间有多少天?
我们先来添加这个date-fns功能differenceInDays:
import { format, addYears, differenceInDays } from 'date-fns';
现在我们只需要创建这两个日期,并将它们传递给函数:
const firstDay = new Date('2019/01/01');
const christmas = new Date('2019/12/24');
const daysBetween = differenceInDays(christmas, firstDay);
console.log(daysBetween); // Outputs => 357
结论
Date-fns 函数看起来可能很复杂,但实际上它是一种超级简单轻便的方式来处理所有日期计算!
额外小技巧:需要立即测试某个日期函数吗?浏览文档时打开开发者工具,即可通过dateFns对象立即使用所有函数。感谢Malinda M.指出这一点!