Web

用date-fns替代momentjs

Posted by Kerwen Blog on February 16, 2023

Moment.js

Moment.js是一个(轻量级)的Javascript日期处理类库,使用它可以轻松解决前端开发中遇到的种种日期时间问题。
Moment.js不依赖任何第三方库,支持字符串、Date、时间戳以及数组等格式,可以格式化日期时间,计算相对时间,获取特定时间后的日期时间等等。
支持中文在内的多种语言。

安装

1
npm install moment

fromNow() 时间间隔或相对时间

1
moment([2007, 0, 29]).fromNow();       // 16 years ago

calendar()
日历时间显示相对于给定的 referenceTime 的时间(默认为现在),但与 moment#fromNow 略有不同。
moment.calendar 会根据日期与 referenceTime 的日期(默认为今天)的接近程度,使用不同的字符串格式化日期。

date-fns

date-fns是另外一个比热门的JavaScript日期处理工具库,越来越多的人用它来替换Moment.js。它一样提供了大量的函数来操作日期。
安装:

1
npm install date-fns --save

date-fns是使用纯函数构建的,并且可以再不改变传递日期实例的情况下保持不变。并且由于date-fns里面每一个方法都是一个文件,所以可以非常方便的只引入需要的部分,这相比于Moment.js可以更方便的降低打包体积。
format():格式化日期

1
2
3
4
console.log(format(new Date(), "yyyy-MM-dd HH:mm:ss", { locale: zhCN })); //  2021-08-10 11:42:31
console.log(format(new Date(), "yyyy-MM-dd HH:mm:ss")); // 2021-08-10 11:38:44
console.log(format(new Date(), "yyyy-MM-dd")); // 2021-08-10
console.log(format(new Date(), "HH:mm:ss")); // 11:38:44

parseISO():将字符串形式的日期转换成Date格式的日期

1
console.log(parseISO("2021-12-19")); // Sun Dec 19 2021 00:00:00 GMT+0800 (中国标准时间)

formatDistanceToNow

1
formatDistanceToNow(new Date(2007, 0, 29), { addSuffix: true })  // about 16 years ago

设置全局local:

1
2
3
import { setDefaultOptions } from 'date-fns';
import { es } from 'date-fns/locale';
setDefaultOptions({ locale: es })

动态改变:

1
2
3
4
import { setDefaultOptions } from 'date-fns';
import * as Locales from 'date-fns/locale';
const language = 'en';
setDefaultOptions({ locale: Locales[language] })

vs

1
2
3
4
5
    console.log(moment(new Date("Wed Feb 15 2023 16:41:55 GMT+080")).calendar());          // Last Wednesday at 11:21 PM
    console.log(formatRelative(new Date("Wed Feb 15 2023 16:41:55 GMT+080"), new Date()));  //Last Wednesday at 11:21 PM

    console.log(moment('2023-01-15 16:41:55').fromNow());      // a month ago
    console.log(formatDistanceToNow(new Date("2023-01-15 16:41:55"), { addSuffix: true }));  // about 1 month ago

Reference Moment.js和date-fns
Moment.js 文档
date-fns

https://stackoverflow.com/questions/47271803/moment-vs-date-fns-locale-date-formats
date-fns: how to define a default locale app-wide?
Add function to set locale globally