【译】你可能不需要Moment.js - 掘金
Moment存在的一些问题
- 它高度基于OOP API,这使得它无法使用Webpack 2 新引入的
Tree-shaking代码优化技术 - 由于OOP API还有非纯函数,这会导致一些bug github.com/moment/mome…
- 如果您没有使用时区,而只使用了moment.js中的一些简单函数,这会导致你的应用程序被引入了很多没使用的方法,这是极其浪费性能和内存的。 在这里推荐使用
dayjs,dayjs有一个较小的核心,并且具有非常相似的API,因此很容易从moment平滑过渡到day.js。date-fns可以使用Tree-shaking代码优化技术和其他good api,因此它很适合与React,Sinon.js和webpack等好基友一起使用。字符串+日期格式化
返回从字符串中解析的日期.// Moment.jsmoment('12-25-1995', 'MM-DD-YYYY');// => "1995-12-24T13:00:00.000Z"// date-fnsimport parse from 'date-fns/parse';parse('12-25-1995', 'MM-dd-yyyy', new Date());// => "1995-12-24T13:00:00.000Z"// dayjsdayjs('12-25-1995');// => "1995-12-24T13:00:00.000Z"复制代码
字符串+时间格式化
返回从字符串中解析的时间日期.
// Moment.jsmoment('2010-10-20 4:30', 'YYYY-MM-DD HH:mm');// => "2010-10-19T17:30:00.000Z"// date-fnsimport parse from 'date-fns/parse';parse('2010-10-20 4:30', 'yyyy-MM-dd H:mm', new Date());// => "2010-10-19T17:30:00.000Z"// dayjs❌不支持自定义格式解析复制代码
字符串+本地格式化
返回从字符串中解析的本地化时间日期.
// Moment.jsmoment('2012 mars', 'YYYY MMM', 'fr');// => "2012-02-29T13:00:00.000Z"// date-fnsimport parse from 'date-fns/parse';import fr from 'date-fns/locale/fr';parse('2012 mars', 'yyyy MMMM', new Date(), { locale: fr });// => "2012-02-29T13:00:00.000Z"// dayjs❌不支持自定义格式解析复制代码
取值 + 赋值
毫秒/秒/分/时
获取 毫秒 / 秒 / 分 / 时。
// Moment.jsmoment().seconds();// => 49moment().hours();// => 19// 原生new Date().getSeconds();// => 49new Date().getHours();// => 19// date-fnsimport getSeconds from 'date-fns/getSeconds';import getHours from 'date-fns/getHours';getSeconds(new Date());// => 49getHours(new Date());// => 19// dayjsdayjs().second();// => 49dayjs().hour();// => 19复制代码
设置 毫秒 / 秒 / 分 / 时。
// Moment.jsmoment().seconds(30);// => "2018-09-09T09:12:30.695Z"moment().hours(13);// => "2018-09-09T03:12:49.695Z"// 原生new Date(new Date().setSeconds(30));// => "2018-09-09T09:12:30.695Z"new Date(new Date().setHours(13));// => "2018-09-09T03:12:49.695Z"// date-fnsimport setSeconds from 'date-fns/setSeconds';import setHours from 'date-fns/setHours';setSeconds(new Date(), 30);// => "2018-09-09T09:12:30.695Z"setHours(new Date(), 13);// => "2018-09-09T03:12:49.695Z"// dayjsdayjs().set('second', 30);// => "2018-09-09T09:12:30.695Z"dayjs().set('hour', 13);// => "2018-09-09T03:12:49.695Z"复制代码
月份日期
设置&获取月份。
// Moment.jsmoment().date();// => 9moment().date(4);// => "2018-09-04T09:12:49.695Z"// 原生new Date().getDate();// => 9new Date().setDate(4);// => "2018-09-04T09:12:49.695Z"// date-fnsimport getDate from 'date-fns/getDate';import setDate from 'date-fns/setDate';getDate(new Date());// => 9setDate(new Date(), 4);// => "2018-09-04T09:12:49.695Z"// dayjsdayjs().date();// => 9dayjs().set('date', 4);// => "2018-09-04T09:12:49.6复制代码
星期几
设置&获取星期。
// Moment.jsmoment().day();// => 0 (Sunday)moment().day(-14);// => "2018-08-26T09:12:49.695Z"// 原生new Date().getDay();// => 0 (Sunday)new Date().setDate(new Date().getDate() - 14);// => "2018-08-26T09:12:49.695Z"// date-fnsimport getDay from 'date-fns/getDay';import setDay from 'date-fns/setDay';getDay(new Date());// => 0 (Sunday)setDay(new Date(), -14);// => "2018-08-26T09:12:49.695Z"// dayjsdayjs().day();// => 0 (Sunday)dayjs().set('day', -14);// => "2018-08-26T09:12:49.695Z"复制代码
一年的某一天
设置&获取一年的某一天。
// Moment.jsmoment().dayOfYear();// => 252moment().dayOfYear(256);// => "2018-09-13T09:12:49.695Z"// date-fnsimport getDayOfYear from 'date-fns/getDayOfYear';import setDayOfYear from 'date-fns/setDayOfYear';getDayOfYear(new Date());// => 252setDayOfYear(new Date(), 256);// => "2018-09-13T09:12:49.695Z"// dayjs ❌ 不支持复制代码
一年的某一周
设置&获取一年的某一周。
// Moment.jsmoment().week();// => 37moment().week(24);// => "2018-06-10T09:12:49.695Z"// date-fnsimport getWeek from 'date-fns/getWeek';import setWeek from 'date-fns/setWeek';getWeek(new Date());// => 37setWeek(new Date(), 24);// => "2018-06-10T09:12:49.695Z"// dayjs ⚠️ requires weekOfYear pluginimport weekOfYear from 'dayjs/plugin/weekOfYear';dayjs.extend(weekOfYear);dayjs().week();// => 37// dayjs ❌ 不支持复制代码
某月有多少天
获取某月有多少天。
// Moment.jsmoment('2012-02', 'YYYY-MM').daysInMonth();// => 29// date-fnsimport getDaysInMonth from 'date-fns/getDaysInMonth';getDaysInMonth(new Date(2012, 1));// => 29// dayjsdayjs('2012-02').daysInMonth();// => 29复制代码
一年有多少周
根据ISO周,获取当年的周数。
// Moment.jsmoment().isoWeeksInYear();// => 52// date-fnsimport getISOWeeksInYear from 'date-fns/getISOWeeksInYear';getISOWeeksInYear(new Date());// => 52// dayjs ❌ does not support weeks in the year复制代码
获取日期最大值
返回给定日期的最大值。
const array = [new Date(2017, 4, 13),new Date(2018, 2, 12),new Date(2016, 0, 10),new Date(2016, 0, 9),];// Moment.jsmoment.max(array.map(a => moment(a)));// => "2018-03-11T13:00:00.000Z"// 原生new Date(Math.max.apply(null, array)).toISOString();// => "2018-03-11T13:00:00.000Z"// date-fnsimport max from 'date-fns/max';max(array);// => "2018-03-11T13:00:00.000Z"// dayjs ❌ 不支持复制代码
获取日期最小值
返回给定日期的最小值。
const array = [new Date(2017, 4, 13),new Date(2018, 2, 12),new Date(2016, 0, 10),new Date(2016, 0, 9),];// Moment.jsmoment.min(array.map(a => moment(a)));// => "2016-01-08T13:00:00.000Z"// 原生new Date(Math.min.apply(null, array)).toISOString();// => "2016-01-08T13:00:00.000Z"// date-fnsimport min from 'date-fns/min';min(array);// => "2016-01-08T13:00:00.000Z"// dayjs ❌ 不支持复制代码
操作比较
添加天数
将指定的天数添加到给定日期。
// Moment.jsmoment().add(7, 'days');// => "2018-09-16T09:12:49.695Z"// date-fnsimport addDays from 'date-fns/addDays';addDays(new Date(), 7);// => "2018-09-16T09:12:49.695Z"// dayjsdayjs().add(7, 'day');// => "2018-09-16T09:12:49.695Z"复制代码
减去天数
从给定日期减去指定的天数。
// Moment.jsmoment().subtract(7, 'days');// => "2018-09-02T09:12:49.695Z"// date-fnsimport subDays from 'date-fns/subDays';subDays(new Date(), 7);// => "2018-09-02T09:12:49.695Z"// dayjsdayjs().subtract(7, 'day');// => "2018-09-02T09:12:49.695Z"复制代码
获月初时间
获取这个月初时间。
// Moment.jsmoment().startOf('month');// => "2018-08-31T14:00:00.000Z"// date-fnsimport startOfMonth from 'date-fns/startOfMonth';startOfMonth(new Date());// => "2018-08-31T14:00:00.000Z"// dayjsdayjs().startOf('month');// => "2018-08-31T14:00:00.000Z"复制代码
获取今天结束的时间
获取今天结束的时间。
// Moment.jsmoment().endOf('day');// => "2018-09-09T13:59:59.999Z"// date-fnsimport endOfDay from 'date-fns/endOfDay';endOfDay(new Date());// => "2018-09-09T13:59:59.999Z"// dayjsdayjs().endOf('day');// => "2018-09-09T13:59:59.999Z"复制代码
显示
格式化
用给定的格式格式化给定的字符串。
// Moment.jsmoment().format('dddd, MMMM Do YYYY, h:mm:ss A');// => "Sunday, September 9th 2018, 7:12:49 PM"moment().format('ddd, hA');// => "Sun, 7PM"// date-fnsimport format from 'date-fns/format';format(new Date(), 'eeee, MMMM do YYYY, h:mm:ss aa');// => "Sunday, September 9th 2018, 7:12:49 PM"format(new Date(), 'eee, ha');// => "Sun, 7PM"// dayjsdayjs().format('dddd, MMMM D YYYY, h:mm:ss A');// => "Sunday, September 9 2018, 7:12:49 PM" ⚠️ not support 9thdayjs().format('ddd, hA');// => "Sun, 7PM"复制代码
获取到现在的年限
获取到现在的年限
// Moment.jsmoment(1536484369695).fromNow();// => "4 days ago"// date-fnsimport formatDistance from 'date-fns/formatDistance';formatDistance(new Date(1536484369695), new Date(), { addSuffix: true });// => "4 days ago"// dayjs ⚠️ requires relativeTime pluginimport relativeTime from 'dayjs/plugin/relativeTime';dayjs.extend(relativeTime);dayjs(1536484369695).fromNow();// => "5 days ago" ⚠️ 这个插件的舍入方法与moment.js和date-fns不同,请谨慎使用。复制代码
时差
返回两个时间点的时差。
// Moment.jsmoment([2007, 0, 27]).to(moment([2007, 0, 29]));// => "in 2 days"// date-fnsimport formatDistance from 'date-fns/formatDistance';formatDistance(new Date(2007, 0, 27), new Date(2007, 0, 29));// => "2 days"// dayjs ⚠️ 需要relativeTime插件import relativeTime from 'dayjs/plugin/relativeTime';dayjs.extend(relativeTime);dayjs('2007-01-27').to(dayjs('2007-01-29'));// => "in 2 days"复制代码
时差(毫秒)
返回两个时间点的毫秒级时差。
// Moment.jsmoment([2007, 0, 27]).diff(moment([2007, 0, 29]));// => -172800000moment([2007, 0, 27]).diff(moment([2007, 0, 29]), 'days');// => -2// date-fnsimport differenceInMilliseconds from 'date-fns/differenceInMilliseconds';differenceInMilliseconds(new Date(2007, 0, 27), new Date(2007, 0, 29));// => -172800000import differenceInDays from 'date-fns/differenceInDays';differenceInDays(new Date(2007, 0, 27), new Date(2007, 0, 29));// => -2// dayjsdayjs('2007-01-27').diff(dayjs('2007-01-29'), 'milliseconds');// => -172800000dayjs('2007-01-27').diff(dayjs('2007-01-29'), 'days');// => -2复制代码
查询
是否之前
检查日期是否在另一个日期之前。
// Moment.jsmoment('2010-10-20').isBefore('2010-10-21');// => true// date-fnsimport isBefore from 'date-fns/isBefore';isBefore(new Date(2010, 9, 20), new Date(2010, 9, 21));// => true// dayjsdayjs('2010-10-20').isBefore('2010-10-21');// => true复制代码
是否一样
检查日期是否与另一个日期相同。
// Moment.jsmoment('2010-10-20').isSame('2010-10-21');// => falsemoment('2010-10-20').isSame('2010-10-20');// => truemoment('2010-10-20').isSame('2010-10-21', 'month');// => true// date-fnsimport isSameDay from 'date-fns/isSameDay';import isSameMonth from 'date-fns/isSameMonth';isSameDay(new Date(2010, 9, 20), new Date(2010, 9, 21));// => falseisSameDay(new Date(2010, 9, 20), new Date(2010, 9, 20));// => trueisSameMonth(new Date(2010, 9, 20), new Date(2010, 9, 21));// => true// dayjsdayjs('2010-10-20').isSame('2010-10-21');// => falsedayjs('2010-10-20').isSame('2010-10-20');// => true// dayjs ❌ 不支持复制代码
是否之后
检查日期是否在另一个日期之后。
// Moment.jsmoment('2010-10-20').isAfter('2010-10-19');// => true// date-fnsimport isAfter from 'date-fns/isAfter';isAfter(new Date(2010, 9, 20), new Date(2010, 9, 19));// => true// dayjsdayjs('2010-10-20').isAfter('2010-10-19');// => true复制代码
是否在两个日期之前
检查日期是否在两个其他日期之间。
// Moment.jsmoment('2010-10-20').isBetween('2010-10-19', '2010-10-25');// => true// date-fnsimport isWithinInterval from 'date-fns/isWithinInterval';isWithinInterval(new Date(2010, 9, 20), {start: new Date(2010, 9, 19),end: new Date(2010, 9, 25),});// => true// dayjs ⚠️ requires isBetween pluginimport isBetween from 'dayjs/plugin/isBetween';dayjs.extend(isBetween);dayjs('2010-10-20').isBetween('2010-10-19', '2010-10-25');// => true复制代码
是否是闰年
判断是否是润年。
// Moment.jsmoment([2000]).isLeapYear();// => true// date-fnsimport isLeapYear from 'date-fns/isLeapYear';isLeapYear(new Date(2000, 0, 1));// => true// dayjs ⚠️ 要引入 isLeapYear 插件import isLeapYear from 'dayjs/plugin/isLeapYear';dayjs.extend(isLeapYear);dayjs('2000').isLeapYear();// => true复制代码
是否是日期对象
检查变量是否是js Date对象。
// Moment.jsmoment.isDate(new Date());// => true// date-fnsimport isDate from 'date-fns/isDate';isDate(new Date());// => true// dayjs ❌ 不支持复制代码
总结
如果你只需要简单的操作那么day.js更适合你,如果复杂一点的项目那么date-fns看起来更合适。
如果你只是用momentjs中的两三个方法,则完全可以考虑使用其他更加轻量、性能更加好的库,或者使用JavaScript原生的方法,必要时封装一下即可。如果程序对性能有较高的要求,最好不要使用momentjs。
