使用date-fns打造你的日期处理utils

1,401 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

new Date() 存在的问题

new Date()的使用语法:

new Date();
new Date(value);
new Date(dateString);
new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);

放在这儿意思意思就好了,本来写的bug就够多了,就不去自增了,只因它的魔幻:

  • 不可靠,输入的参数格式不同可能就会导致结果完全不同
new Date("2022-10-28") // 2022-10-28T00:00:00.000Z 🙂
new Date(2022, 10, 28) // 2022-11-27T16:00:00.000Z 🙃
  • 没有用于计算日期的 API,比如时间之间的加减运算
  • 没有切换时区的 API
  • 不支持各国自己的历法,比如我们的农历

为什么是 date-fns

  • moment.js
    • 优点
      • 是一个大而全的时间日期库
      • 早在2011年就开始被使用,受众广泛
    • 缺点
      • moment对象过于臃肿,包的大小有 280.9 kB,且不支持打包工具的tree-shaking
      • 对于原生 Date 对象存在侵入性的修改,返回的对象是可变的
      • 官方已停止开发,进入维护状态
  • day.js
    • APIMoment.js 有 9 成以上相似,学习成本低
    • 相比moment.js,体积更小,仅有 2kb 大小
  • date-fns
    • 支持按需引入需要的模块,支持tree-shaking
    • 总是返回新的日期对象,输出不可变

格式化日期

/* 语法
format(date: number | Date, format: string, options?: {
   locale?: Locale | undefined;  // locale为中国时间
   weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined;
   firstWeekContainsDate?: number | undefined;
   useAdditionalWeekYearTokens?: boolean | undefined;
   useAdditionalDayOfYearTokens?: boolean | undefined;
} | undefined): string
*/

format(new Date(), "yyyy-MM-dd HH:mm:ss", { locale: zhCN }); //  2022-10-28 11:38:44
format(new Date(), "yyyy-MM-dd HH:mm:ss"); // 2022-10-28 11:38:44
format(new Date(), "yyyy-MM-dd"); // 2022-10-28
format(new Date(), "HH:mm:ss"); // 11:38:44

计算某天加减多少天数是哪一天

 /* 语法
 addDays(date: number | Date, amount: number): Date
 */
addDays(new Date(), 1) // Sat Oct 29 2022 11:47:07 GMT+0800 (中国标准时间)
addDays(new Date(), -1) // Thu Oct 27 2022 11:47:07 GMT+0800 (中国标准时间)

同样用法的还有:

  • addMonths() :几个月后的日期
  • addHours() :几个小时后的日期
  • addMinutes() :几分钟后的日期
  • addWeeks() :几周后的日期

计算两个时间之间相差的天数

/* 语法
differenceInDays(dateLeft: number | Date, dateRight: number | Date): number
 */
differenceInDays(new Date("2022-10-28"), new Date("2021-10-1")) // 27

同样用法的还有:

  • differenceInMonths():计算两个时间之间相差的月份
  • differenceInYears():计算两个时间之间相差的年数
  • differenceInHours():计算两个时间之间相差的小时
  • differenceInWeeks():计算两个时间之间相差的周数

将字符串形式的日期转换成Date格式的日期

/*语法
parseISO(argument: string, options?: {
    additionalDigits?: 0 | 1 | 2 | undefined;
} | undefined): Date
*/
parseISO("2022-10-28"); // Fri Oct 28 2022 00:00:00 GMT+0800 (中国标准时间)