date-fns简介–轻量级JavaScript日期库

date-fns简介

在JavaScript中使用日期是一种痛苦。 本地日期方法通常很冗长, 有时也不一致 —这也使它们易于出错。 但是,好消息即将到来。 有一些库可以消除过时的痛苦。 这些库是JavaScript日期,而jQuery是本机DOM API。

让我举一个例子。 这是对堆栈溢出问题的公认答案,该问题询问如何获得每月的最后一天

var t = new Date();
alert( new Date(t.getFullYear(), t.getMonth() + 1, 0, 23, 59, 59) );

当然可以,但是getMonth之后的数字代表什么并不立即可见。 现在将其与更具可读性的对比:

const today = new Date();
console.log( lastDayOfMonth(today) );

lastDayOfMonth方法是date- lastDayOfMonth提供的, date- lastDayOfMonth是一个lastDayOfMonth为功能lastDayOfMonth综合工具集,用于在浏览器和Node.js中操纵JavaScript日期。

在本文中,我将向您展示如何启动和运行date-fns。 阅读后,您将可以将其放入项目中,并利用其许多辅助方法轻松地操作日期。 这将使像t.getMonth() + 1, 0, 23, 59, 59这样的代码成为过去。

那么,为什么不仅仅使用Moment.js?

房间里的大象是Moment.js 。 无疑,该库已成为在JavaScript中使用日期的实际标准。 那么为什么不使用它呢? 为什么我们需要另一个JavaScript日期库?

好吧,根据date-fns的创建者Sasha Koss的说法,Moment.js存在一些固有的问题,促使他创建了date-fns。 Sasha在项目的GitHub页面上扩展了这些问题的内容,但简而言之:

  • Moment.js易变,可能会导致错误。
  • 它具有复杂的OOP API(这使可变性问题加倍了)。
  • 由于API复杂,因此具有性能开销。
  • 与Webpack一起使用时,它的构建大小很大,因为语言环境文件作为捆绑包的一部分包含在内。

让我们与date-fns(来自项目主页 )进行对比:

  • Date-fns是不可变的,总是返回一个新日期,而不是更改您传递的日期。
  • 它有一个简单的API。 您总是只有一个功能可以做一件事。
  • 很快 您可以确定您的用户将拥有最佳的用户体验。
  • 它是Webpack的完美伴侣。 使用每个文件的功能样式,您可以选择所需的内容,并停止使用无用功能的项目肿。

对我来说,使它发光的功能是易于使用。 在基于Web的项目中使用它时,您只需从CDN中获取date-fns,然后将其放入页面即可获利。 接下来的更多内容...

安装

有多种安装库的方法。

它可以作为npm软件包使用:

npm install date-fns --save

或通过纱线:

yarn add date-fns

或凉亭:

bower install date-fns

或从CDN:

<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.28.5/date_fns.min.js"/>

如果选择此方法,请注意,该库在dateFns对象下命名空间,就像jQuery在$下命名空间一样。

<script>
  console.log(
    dateFns.isToday(new Date())
  );
</script>

Date-fns基本用法

假设您正在使用模块加载器 ,则仅需要您需要的那些部件。 以下示例显示如何格式化日期

const format = require('date-fns/format');
console.log(
  format(new Date(2017, 6, 6), 'MM/DD/YYYY')
);

// '06/07/2017'

是否要更改语言环境? 没问题:

const format = require('date-fns/format');
const deLocale = require('date-fns/locale/de') // German

console.log(
  format(new Date(2017, 6, 6), 'DD MMMM YYYY', { locale: deLocale })
);

// 06 Juli 2017

以下是支持的语言列表

如果您使用的是浏览器,请不要忘记dateFns helper方法的任何调用都挂在dateFns对象之外。 以下是使用恰当命名的lastDayOfMonth方法确定月份的最后一天的方法:

<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.28.5/date_fns.min.js"></script>
<script>
  console.log(
    dateFns.lastDayOfMonth( new Date(2017, 6, 7) )
  );
  // Mon Jul 31 2017 00:00:00 GMT+0200 (CEST)
</script>

注意date-fns具有确定季度的最后一天的等效方法。

不变性,纯正和简单

date-fns的卖点之一是其功能纯净,易于解释。 这样可以使代码易于理解,并在出现问题时更易于调试。

让我使用Moment.js作为反示例进行演示。 如前所述,Moment中的日期是可变的,这可能导致意外行为。

const moment = require('moment');
const now = new Date(); 
const mNow = moment(now);

mNow.add('day', 3);
console.log(mNow.toDate());
mNow.add(3, 'day');
console.log(mNow.toDate());

// 2017-07-08T22:00:00.000Z
// 2017-07-11T22:00:00.000Z

这里有几件事要注意。 Moment的add函数对其接受其参数的顺序并不挑剔(尽管第一个方法现在将抛出弃用警告)。 但更令人困惑的是,如果您连续多次调用add ,您将不会得到相同的结果,因为Moment对象是可变的:

mNow.add(3, 'day'); // add 3 days
mNow.add(3, 'day'); // adds 3 **more** days

现在将其与date-fns进行比较,后者将参数保持在一个顺序中,并且始终返回相同的结果,并为每个调用返回一个新的Date对象。

let addDays = required('date-fns/add_days');
addDays(now, 3); // (April 30, 2017)
addDays(now, 3); // (April 30, 2017)
addDays(now, 3); // (April 30, 2017)

还要注意方法名称如何更具表现力( addDays而不是add ),保持事物的一致性,并使一种方法只能执行一件事情和一件事情。

比较日期

如果您查看SitePoint JavaScript频道上的帖子列表,可以看到有些列表被列出为在某个日期发布,而另一些列表被列出为在X天前发布。 如果您尝试在原始JavaScript中实现它可能会花费一些时间,但是使用date-fns则很容易–只需使用distanceInWords方法即可。

让我们比较两个不同的日期。

const distanceInWords = require('date-fns/distanceInWords');
const startDate = new Date(2017, 3, 27); // (April 27, 2017)
const endDate = new Date(2018, 3, 27); // (April 27, 2018)
console.log(
  distanceInWords(startDate, endDate)
);
// "about 1 year"

在date-fns中,如果您想知道另一个单位的差异,则可以替换以下任何一种方式:

  • 毫秒
  • 分钟
  • 小时
  • 月数
  • 年份

其中方法名称为differenceIn[any of the above here]例如differenceInDays

处理日期集合

Date-fns有一些非常方便的帮助程序方法,您可以使用它们以各种方式来操纵日期集合。

订购日期收集

以下示例使用compareAsc将日期按升序排序。 为此,如果第一个日期在第二个日期之后,则返回1;如果第一个日期在第二个日期之前,则返回-1;如果日期相等,则返回0。

const compareAsc = require('date-fns/compare_asc');
const date1 = new Date('2005-01-01');
const date2 = new Date('2010-01-01');
const date3 = new Date('2015-01-01');
const arr = [date3, date1, date2];
const sortedDates = arr.sort(compareAsc);

// [ 2005-01-01, 2010-01-01, 2015-01-01 ]

如您所见,日期现在按升序排列。

compareAsc的对应方法是compareDesc

const compareDesc = require('date-fns/compare_desc');
...
const sortedDates = arr.sort(compareDesc);
// [ 2015-01-01, 2010-01-01, 2005-01-01 ]

生成两个日期之间的日期

要生成两个日期之间的日期,可以使用我们先前遇到的addDays方法 ,以及eachDay帮助器 ,该方法返回指定范围内的日期数组。

const addDays = require('date-fns/add_days');
const eachDay = require('date-fns/each_day');
const today = new Date();
const dayAWeekFromNow = addDays(today, 7);
const thisWeek = eachDay(today, dayAWeekFromNow); 
console.log(thisWeek);

// [ 2017-07-03, 2017-07-04, 2017-07-05, 2017-07-06, 2017-07-07, 2017-07-08, 2017-07-09, 2017-07-10 ]

寻找最近的日期

可以使用ClosedTo方法在日期数组中查找与某个日期最接近的日期。 此代码段来自上一个示例:

const closestTo = require('date-fns/closest_to');
...
const christmas = new Date(2017, 11, 25);
const closestToChristmasDate = closestTo(christmas, thisWeek); 
// 2017-07-10T

如果您想获取数组的索引,则还有closeestIndexTo方法。

时区

date-fns的一个缺点是它目前没有像Moment.js一样的任何时区帮助程序功能。 这个Stack Overflow答案实际上为原生Date对象如何实际不存储“实时区域”数据提供了一些背景知识。 但是,date-fns始终返回运行代码的本地时区。

在该线程中,您会注意到他们提到了在JavaScript中原生设置时区的一种有限方式。 如答案所示,这不是一个全面的解决方案,但是它适用于仅需要输出转换(从UTC或本地时间到特定时区)的许多情况。

new Date().toLocaleString("en-US", {timeZone: "America/New_York"});

时区实际上是一个要解决的复杂问题,这就是为什么MomentJS有一个单独的库。 还计划在date-fns中增加时区支持 ,但是在撰写本文时,这仍在进行中。

结论

Date-fns是一个很棒的小程序库,它为您提供了很多在JavaScript中处理日期的辅助方法。 我希望本文能给您足够的理解和启发,以便您进行检查并开始在自己的项目中使用它。 该库正在非常积极的开发中,希望版本2即将来临。

鉴于此,我让您开始使用date-fns,在下面的评论中,请让我知道您如何使用date-fns。

From: https://www.sitepoint.com/date-fns-javascript-date-library/

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
date-fns是一个现代JavaScript日期实用程序,用于处理日期和时间。它提供了丰富的日期处理功能,包括格式化、解析、计算、比较等等。 如果您想在Nuxt.js项目中使用date-fns,您可以通过以下命令将@nuxtjs/date-fns作为依赖项添加到项目中: ```bash yarn add --dev @nuxtjs/date-fns ``` 或者 ```bash npm install --save-dev @nuxtjs/date-fns ``` 有时候,在安装date-fns包时可能会遇到问题。例如,您可能会遇到"Range Error: locale must contain localize property"错误,这可能是由于date-fns的版本不匹配所致。解决此问题的一种方法是使用以下命令行安装适当的版本: ```bash npm i date-fns@next ``` 这将安装版本为"^2.0.0-alpha.27"的date-fns。另外,有时在使用TypeScript检测时可能会出现没有默认导出的问题。您可以尝试使用下面的导入方式解决该问题: ```typescript import * as th from 'date-fns/locale/th' ``` 通过这些步骤,您可以成功安装和使用date-fns依赖项。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [date-fns-module:现代JavaScript日期实用程序-Nuxt.js的date-fns](https://download.csdn.net/download/weixin_42102634/18242068)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [react-datepicker组件依赖date-fns实现国际化功能时遇到的问题以及解决方法](https://blog.csdn.net/cc18868876837/article/details/86744583)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值