日期操作是 JavaScript 中的常见任务,原生 Date
对象提供了一些基本功能。但是,处理日期可能很复杂且容易出错,并且 Date
缺乏执行这些常见任务所需的功能。为了使日期处理变得更容易、更可靠,开发人员必须依赖第三方库。 JavaScript 生态系统中有很多可用的,但 date-fns 脱颖而出,成为事实上的标准。它是一个用于解析、格式化和操作日期的轻量级实用程序库。
在本教程中,我们将探索使用 date-fns 的基础知识,并涵盖处理日期的最常用函数。最后,您将深入了解如何将 date-fns 合并到 JavaScript 项目中以有效处理日期。
安装 date-fns
date-fns 是一个 Node 包。因此,如果您使用 NPM、Babel 或 Webpack 等工具堆栈,则可以使用以下 npm 命令安装 date-fns:
npm install date-fns --save
如果您对其中任何一个感到陌生,请不要担心;您也可以在浏览器中使用 date-fns!只需将以下 元素添加到您的 HTML 中即可:
<script type="module"> import * as dateFns from 'https://cdn.jsdelivr.net/npm/date-fns/+esm'; </script>
这是一个 JavaScript 模块,从 jsdelivr 网络导入最新版本的 date-fns 库。通过此导入,所有 date-fns 函数和实用程序都可以通过 dateFns
对象访问。请注意,要成功运行本教程中的所有代码,代码必须包含在导入 date-fns 的同一模块中。
格式化日期
处理日期时的主要任务之一是将其格式化为人类可读的字符串。 JavaScript 的 Date
对象对格式化日期具有基本支持,但缺乏对自定义格式的支持。 date-fns 为此提供了格式化函数。
const today = new Date(); const formattedDate1 = dateFns.format(today, 'dd MMMM yyyy'); console.log(formattedDate1); // Output: "29 July 2023" const formattedDate2 = dateFns.format(today, 'yyyy-MM-dd'); console.log(formattedDate2); // Output: 2023-07-29
在此示例中,我们创建一个新的 Date
对象,表示当前日期。然后,我们使用 format()
函数根据提供的格式字符串格式化日期。格式字符串使用占位符,例如 dd
表示两位数的日期,MMMM
表示完整的月份名称,yyyy
表示全年。
第二次调用 format()
使用 yyyy-MM-dd
格式。 MM
占位符指的是两位数月份。
format()
函数还可以轻松格式化时间。使用 h
或 hh
占位符输出一位或两位数的小时,mm
输出两位数的分钟,a
输出 AM/PM 指示器。例如:
const formattedDateAndTime = dateFns.format(today, 'yyyy-MM-dd h:mm a'); console.log(formattedDateAndTime); // Output: 2023-07-29 12:50 PM
您可以使用许多占位符来设置日期和时间的格式。下表列出了一些内容,但请务必访问文档以获取完整列表。
单位 | 占位符 | 结果示例 |
---|---|---|
日历年(2 位数字) | 年 | 23 |
日历年(4 位数字) | 年 | 2023 |
月份(1 位数字) | 中号 | 7 |
月份(2 位数字) | 毫米 | 07 |
月份(简称) | MMM | 一月、二月、十二月 |
月份(全名) | MMMM | 一月、二月 |
一月中的某天(1 位数字) | d | 5, 23 |
月份中的日期(2 位数字) | dd | 05, 23 |
星期几(缩短) | E | 周一、周二、周三 |
星期几(全名) | EEEE | 周一、周二 |
上午、下午 | 一个 | 上午、下午 |
小时(12 小时制,1 位数字) | 小时 | 1,2,10 |
小时(12 小时制,2 位数字) | 呵呵 | 01,02,10 |
小时(24 小时制,1 位数字) | 小时 | 1、2、10、23 |
小时(24 小时制,2 位数字) | 呵呵 | 01,02,10,23 |
分钟(1 位数字) | 中号 | 1、2、3、25、30、58 |
分钟(2 位数字) | 毫米 | 01,02,03,24,56 |
第二位(1 位数字) | s | 1、2、3、10、58 |
第二个(2 位数字) | SS | 01,02,10,45 |
解析日期
在处理用户输入或来自外部源的数据时,我们通常需要解析字符串中的日期。 date-fns 为此提供了 parse()
函数。
const dateString = '2023-07-15'; const parsedDate = dateFns.parse(dateString, 'yyyy-MM-dd', new Date()); console.log(parsedDate); // Output: Date object representing July 15, 2023
在此代码中,我们使用格式 yyyy-MM-dd
解析来自 dateString
的日期,该格式对应于提供的日期字符串。第三个参数是用于计算解析日期的基准日期。在本例中,我们使用当前日期作为基准。
添加和减去日期
通过添加或减去时间间隔来操作日期是日期处理中的常见要求。 date-fns 提供了一组方便的函数来轻松执行这些操作。
以下示例演示了 addDays()
和 subDays()
函数:
const startDate = new Date(2023, 6, 15); // July 15, 2023 const fiveDaysLater = dateFns.addDays(startDate, 5); console.log(fiveDaysLater); // Output: Date object representing July 20, 2023 const threeDaysAgo = dateFns.subDays(startDate, 3); console.log(threeDaysAgo); // Output: Date object representing July 12, 2023
在此示例中,我们从给定的 2023 年 7 月 15 日的 startDate
开始。然后使用 addDays()
函数计算 5 天后的日期,并使用 subDays( )
函数查找 3 天前的日期。
除了添加和减去天数之外,date-fns 还提供了添加和减去月份和年份的函数。正如您所期望的,它们被命名为 addMonths()
、subMonths()
、addYears()
和 subYears()
。
操作日期时,必须注意边缘情况。例如,当减去月份或年份时,结果日期可能不存在(例如 2 月 30 日),而 date-fns 通过调整日期来智能处理这种情况。
const startDate = new Date(2023, 0, 31); // January 31, 2023 const oneMonthLater = dateFns.addMonths(startDate, 1); console.log(oneMonthLater); // Output: Date object representing February 28, 2023
在此示例中,从 2023 年 1 月 31 日开始,添加一个月结果为 2023 年 2 月 28 日,因为 2 月没有第 31 天。
查找日期之间的差异
JavaScript 的 Date
对象完全缺乏查找两个 Date
对象之间差异的能力。值得庆幸的是,date-fns 有几个函数可以用来查找两个 Date
s 之间的差异。其中一些是:
函数名称 | 目的 |
---|---|
differenceInMilliseconds() |
获取给定日期之间的毫秒数。 |
differenceInSeconds() |
获取给定日期之间的秒数。 |
differenceInMinutes() |
获取给定日期之间的分钟数。 |
differenceInHours() |
获取给定日期之间的小时数。 |
differenceInBusinessDays() |
获取给定日期之间的工作日数。 |
differenceInDays() |
获取给定日期之间的完整天数。 |
differenceInMonths() |
获取给定日期之间的月数。 |
differenceInYears() |
获取给定日期之间的年数。 |
还有许多其他“差异”函数,因此请务必检查文档。
考虑以下示例:
const startDate = new Date(2023, 6, 15); // July 15, 2023 const endDate = new Date(2023, 6, 22); // July 22, 2023 const daysDifference = dateFns.differenceInDays(endDate, startDate); console.log(daysDifference); // Output: 7
在本例中,我们使用 differenceInDays()
函数来计算 startDate
和 endDate
。输出为 7
。
使用时区
使用时区可能是使用日期和时间时最令人沮丧的方面之一,但 date-fns 使用 utcToZonedTime()
和 formatDistanceToNow()
等函数使之变得更容易。考虑以下示例:
const utcDate = new Date(Date.UTC(2023, 6, 15, 12, 0, 0)); const timezone = 'America/New_York'; const zonedDate = dateFns.utcToZonedTime(utcDate, timezone); console.log(dateFns.formatDistanceToNow(zonedDate)); // Output: "6 months"
在此示例中,我们使用 utcToZonedTime()
函数将 utcDate
转换为 America/New_York
时区。然后我们使用 formatDistanceToNow()
函数来获取分区日期和当前时间之间的时差。
处理无效日期
我们永远不能信任来自用户的数据,并且通常最好不要信任任何您无法控制的数据。因此,我们需要能够检查 Date
是否有效,并且 date-fns 为此提供了 isValid()
函数。例如:
const validDate = new Date(2023, 1, 30); // February 30, 2023 is not a valid date const invalidDate = new Date(NaN); // Invalid date console.log(dateFns.isValid(validDate)); // Output: true console.log(dateFns.isValid(invalidDate)); // Output: false
此示例创建了有效和无效的 Date
对象。然后我们使用 isValid()
函数来确定它们是否是有效日期。
结论
date-fns 是一个功能强大且易于使用的库,可以在 JavaScript 中处理日期时为您节省大量时间和精力。本教程仅触及该库功能的表面,因此请务必通过查看官方文档来探索其功能和可用选项。
以上就是使用 date-fns 简化日期操作的详细内容,更多请关注知企PROSAAS其它相关文章!
<!--
-->
智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
我要提问
<!-- -->
相关标签:
JavaScript html npm webpack date format 字符串 栈 堆 对象
来源:知企PROSAAS
收藏
点赞
上一篇:JavaScript 要点:释放 CodePen.io 的力量
下一篇:WordPress 3.4 到来后下一步是什么?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
-
国星光电成功推出1.84英寸全彩Micro LED显示屏nStar Ⅲ,迎来亮眼成就2023-12-06 09:27:12
-
中国气象局与华为加快合作,推动AI等技术在气象领域的应用2023-12-06 08:51:34
-
Microsoft 推出必应深度搜索,提供更相关的答案,适用于复杂搜索查询2023-12-06 08:37:43
-
传小米14系列加单40%,传索尼主机独占GTA6首发1年,知网专利可测出AI文本,蔚来收购江淮部分资产,这就是今天的其他大新闻!2023-12-06 08:35:14
-
如何更改iPhone上的默认提示音2023-12-06 08:27:43
-
小米金凡:澎湃 OS 的连接能力最强,没有之一2023-12-06 08:13:16
-
美图推出 AI 模型 MiracleVision 4.0 版,可生成矢量图形2023-12-05 20:38:14
-
一加发布AIRVOOC 50W无线闪充充电器A1,售价首发249元2023-12-05 20:35:08
-
确保你的Apple Magic Keyboard电量充足:在macOS上查看电池状态2023-12-05 20:15:16
-
蔚来Q3营收增长46.6%,31.6亿元成功收购江淮汽车资产2023-12-05 18:57:16
最新问题
Laravel Cashier - Stripe 多种付款方式
我的餐厅使用LaravelCashier和Stripe。我想为我的客户使用Stripe支持的多种付款方式,但我在LaravelCashier文档中找不到有关在Stripe中使用多种...
P粉652495194来自于2023-12-11 18:56:12
0
2
213
FastAPI: 如何在HTML文件中同时渲染CSS/JS/Images?
我在FastAPI中渲染HTMl文件时遇到问题。main.py文件static_dir=os.path.join(os.path.dirname(__file__),"...
P粉237125700来自于2023-12-11 17:58:49
0
1
239
老师,笔记能分享一下吗
老师,笔记能分享一下吗
手机用户3055476来自于2023-12-12 16:46:38
0
0
24
Nuxt 构建错误:TypeError:无法解构属性“nuxt”的“这个”因为它是未定义的
我想创建一个新的Nuxt项目并按照此处的说明进行操作:https://nuxtjs.org/docs/get-started/installation。基本上只是运行npminit...
P粉156415696来自于2023-12-11 16:47:40
0
2
168
CSS径向渐变到SVG径向渐变
是否可以在SVG中制作径向渐变,就像在CSS中一样http://codepen.io/A973C/pen/hnEaf(我指的是交通灯中的灯).red{background:red;...
P粉308783585来自于2023-12-11 15:54:09
0
2
242
未定义类型“Validator”.intelephense(1009)
谁能帮我解决这个错误吗?我是Laravel新手,我正在制作一个ProductController文件,但我从Validator收到此错误:我已经调用了useValidator;我还...
P粉010967136来自于2023-12-11 15:05:11
0
1
196
Laravel 9 上未找到混合清单 - vite
当我运行npmrunbuild时遇到问题,它说找不到混合清单。当我在生产中运行时会发生这种情况。我的npm-v是9.1.2并运行laravel9,带有“php”:“^8.0.2”。...
P粉974462439来自于2023-12-11 13:40:48
0
1
217
Vue3:如何将参数发送到路由而不将它们添加到 Vue3 中的 url 中?
在Vue3中,有没有一种方法可以将属性传递给路由,而无需在url中显示值?我这样定义路线:{path:'/someRoute',name:'someRoute',component...
P粉465675962来自于2023-12-11 13:07:20
0
1
214
在JSP bean中实现动态文本框及其值的提交
我有一个带有几个预定义文本框的表单,现在除此之外我还创建了一些动态文本框,我可以用javascript来完成它(我猜)。提交表单时,如何将动态生成的文本框的值设置为bean。在be...
P粉916760429来自于2023-12-11 11:56:28
0
1
190
识别特定行具有一致值的列名
我正在尝试在mysql中进行查询以获取某一特定行具有特定值的任何列。在Mysql中,我们可以根据列的任何特定值获取行。我有一个像这样的表:+----+------------+--...
P粉738046172来自于2023-12-11 09:56:34
0
1
133
相关专题
更多>
-
js获取数组长度的方法 -
js刷新当前页面 -
js四舍五入 -
js删除节点的方法 -
JavaScript转义字符 -
js生成随机数的方法 -
如何启用JavaScript -
Js中Symbol类详解
文章标题:使用 date-fns 简化日期操作
文章链接:https://www.prosaas.cn/4680.html
更新时间:2023年09月03日
声明: 本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:973664285@qq.com我们将第一时间处理! 资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。 所有资源仅限于参考和学习,版权归原作者所有,更多请阅读知企PROSAAS协议