Momentjs | 实用场景

1,572 阅读4分钟

Moment

1.时间戳与时间转换

 moment().valueOf();

moment#valueOf 简单地输出自 Unix 纪元以来的毫秒数,就像 Date#valueOf 一样。

 moment(1318874398806).valueOf(); // 1318874398806
 +moment(1318874398806); // 1318874398806

要从 Moment 获取 Unix 时间戳(自该纪元以来的秒数),则使用 moment#unix

 moment().unix();

moment#unix 输出 Unix 时间戳(自 Unix 纪元以来的秒数)

 moment(1318874398806).unix(); // 1318874398
 moment("2020-01-01 00:00:00").unix(); //当前时间时间戳 1577808000

此值的下限为最接近的秒数,且不包括毫秒部分。

!!!但是unix打印的时间戳为 10 位,而 moment()解析的位数为 13 位时间戳

 moment(1597809182).format(); //1970-01-19T19:50:09+08:00

直接使用就会导致打印的时间为 1970...导致时间不准确,如果想要正确使用就得先将获取的时间戳乘 1000,会存在一些误差,会存在毫秒的误差,对秒没有影响。

 moment(moment().unix() * 1000).format(); //当前时间

2.判断日期是否有效

moment().isValid()虽然可以判断一个日期是否有效,但是如果日期是非法的,比如为空字符串('')或者其他非法的字符串,null等等,都会返回 false,在运行时会报错并且catch不到,所以必须要先判断这个日期的格式是不是一个标准的日期格式。

当从字符串创建 moment 时,需要首先检查字符串是否与已知的 ISO 8601 格式匹配,如果未找到已知的格式,则在降维到 new Date(string) 之前检查字符串是否与 RFC 2822 日期时间格式匹配。

函数参数在未传入时默认为 undefined。 Moment 会将 moment(undefined) 视作 moment()。所以moment(undefined).isValid()会返回 true

 let date=moment(date).format('YYYY-MM-DD HH:mm:ss');
 date&&moment(date).isValid(); 

3.增加时间或者减去时间

 moment().add(Number, String); 
 moment().add(Duration); 
 moment().add(Object);

这是一个相当稳健的功能,可以为现有的 moment 增加时间。 若要增加时间,则传入要增加的时间的键、以及要增加的数量。

 moment().add(7, 'days');

如果对希望简短,也有一些快捷的键。

 moment().add(7, 'd');
快捷键
yearsy
quartersQ
monthsM
weeksw
daysd
hoursh
minutesm
secondss

如果要同时增加多个不同的键,则可以将它们作为对象字面量传入。

 moment().add(7, 'days').add(1, 'months'); // 链式调用
 moment().add({days:7,months:1}); // 对象字面量

增加的数量Number可以为正数(增加时间),负数(减去时间)。 减去时间也可以用subtract。

 moment().subtract(Number, String);
 moment().subtract(Duration);
 moment().subtract(Object);

这与 moment#add 完全相同,只是不增加时间,而是减去时间。

 moment().subtract(7, 'days');

4.年,月,周,日等时间单位的开头和末尾

 moment().startOf(String);

通过将原始的 moment 设置为时间单位的开头来对其进行更改。

 moment().startOf('year');    // 设置为今年一月1日上午 12:00
 moment().startOf('month');   // 设置为本月1日上午 12:00
 moment().startOf('quarter');  // 设置为当前季度的开始,即每月的第一天上午 12:00
 moment().startOf('week');    // 设置为本周的第一天上午 12:00
 moment().startOf('isoWeek'); // 根据 ISO 8601 设置为本周的第一天上午 12:00
 moment().startOf('day');     // 设置为今天上午 12:00
 moment().startOf('date');     // 设置为今天上午 12:00
 moment().startOf('hour');    // 设置为当前时间,但是 0 分钟、0 秒钟、0 毫秒
 moment().startOf('minute');  // 设置为当前时间,但是 0 秒钟、0 毫秒
 moment().startOf('second');  // 与 moment().milliseconds(0); 相同

这些快捷方式与以下的基本相同。

 moment().startOf('year');
 moment().month(0).date(1).hours(0).minutes(0).seconds(0).milliseconds(0);

通过将原始的 moment 设置为时间单位的末尾来对其进行更改。

 moment().endOf(String);

这与 moment#startOf 相同,只是将其设置为时间单位的末尾,而不是设置为时间单位的开头。

 moment().endOf("year"); // 将 moment 设置为今年的 12 月 31 日 23:59:59.999

5.换算时间差diff()

 moment().diff(Moment|String|Number|Date|Array); 
 moment().diff(Moment|String|Number|Date|Array, String); 
 moment().diff(Moment|String|Number|Date|Array, String, Boolean);

要获取两个时刻之间的差值的时长,则可以将 diff 作为参数传给 moment#duration

支持的度量有 yearsmonthsweeksdayshoursminutesseconds

如果该时刻早于传给 moment.fn.diff 的时刻,则返回值为负数。

 var a = moment();
 var b = moment().add(1, 'seconds');
 a.diff(b) // -1000
 b.diff(a) // 1000

6.计算两个日期间隔的每一个日期

 const daysBetweenDates = (startDate, endDate) => {
     let daysList = [];
     const start = moment(startDate);
     const end = moment(endDate);
     const day = end.diff(start, "days");
     daysList.push(start.format("YYYY-MM-DD"));
     for (let i = 1; i <= day; i++) {
     daysList.push(start.add(1, "days").format("YYYY-MM-DD"));
     }
     return daysList;
 }