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');
键 | 快捷键 |
---|---|
years | y |
quarters | Q |
months | M |
weeks | w |
days | d |
hours | h |
minutes | m |
seconds | s |
如果要同时增加多个不同的键,则可以将它们作为对象字面量传入。
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
。
支持的度量有 years
、months
、weeks
、days
、hours
、minutes
和 seconds
。
如果该时刻早于传给 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;
}