Moment.js日期库
- 中文官网http://momentjs.cn
- 安装
- npm install moment --save
- cdn地址:ttp://cdn.staticfile.org/moment.js/2.24.0/moment.js
一、 创建一个moment 对象
moment();
moment(undefined);
moment([]);
moment({});
// 要获取当前的日期和时间,只需调用不带参数的 moment() 即可。
var now = moment();
1. moment(String); moment(String) 带格式
var day = moment("1999-5-25");
moment("12-25-1995", "MM-DD-YYYY");
2. moment(Number);
与 new Date(Number) 类似,可以通过传入一个整数值来创建 moment,
该整数值表示自 Unix 纪元(1970 年 1 月 1 日 12AM UTC)以来的毫秒数。
var day = moment(1318781876406);
3. moment.unix(Number);
若要从 Unix 时间戳(自 Unix 纪元以来的秒数)创建 moment,则使用 moment.unix(Number)。
var day = moment.unix(1318781876);
4. moment(Date)
可以使用预先存在的原生 Javascript Date 对象来创建 Moment。
这会克隆 Date 对象,Date 的后续更改不会影响 Moment,反之亦然。
var day = new Date(2011, 9, 16);
var dayWrapper = moment(day);
5. moment(Number[])
可以使用数值的数组(映射传给 new Date() 的参数)来创建 moment。
[year, month, day, hour, minute, second, millisecond]
moment([2010, 1, 14, 15, 25, 50, 125]); // February 14th, 3:25:50.125 PM
6. moment(Moment);
所有的 moment 都是可变的。 如果想要克隆 moment,则可以隐式或显式地操作。
在 moment 上调用 moment() 将会克隆它。
var a = moment([2012]);
var b = moment(a);
a.year(2000);
b.year(); // 2012
也可以调用 moment.clone 克隆 moment。
7. 默认值
可以创建一个 moment 对象,仅指定一些单位,
其余的将会默认为当前的日期、月份、年份,小时、分钟、秒钟和毫秒默认为 0 。
moment(5, "HH"); // 今天 5:00:00.000
moment({hour: 5}); // 今天 5:00:00.000
二、 取值和赋值
Moment.js 使用重载的 getter 和 setter 方法
这些会映射到原生 Date 对象上的相应函数
moment().seconds() === new Date().getSeconds();
1. millisecond() 获取或设置毫秒。
接受 0 到 999 之间的数字。 如果超出范围,则它将会冒泡到秒钟。
moment().millisecond(Number);
moment().millisecond(); // 数字
2. second() 获取或设置秒钟。
moment().second(Number);
moment().second(); // 数字
接受 0 到 59 之间的数字。 如果超出范围,则它将会冒泡到分钟。
3. minute() 获取或设置分钟。
moment().minute(Number);
moment().minute(); // 数字
接受 0 到 59 之间的数字。 如果超出范围,则它将会冒泡到小时。
4. hour() 获取或设置小时。
moment().hour(Number);
moment().hour(); // 数字
接受 0 到 23 之间的数字。 如果超出范围,则它将会冒泡到日期。
5. date() 获取或设置月份的日期。
moment().date(Number);
moment().date(); // 数字
接受 1 到 31 之间的数字。 如果超出范围,则它将会冒泡达到月份。
注意:Moment.date 是月份的日期,而 Moment.day 是星期几。
6. day() 获取或设置星期几。
moment().day(Number|String);
moment().day(); // 数字
此方法可用于设置星期几,其中星期日为 0、星期六为 6。
如果给定的值是 0 到 6,则结果的日期将会在当前(星期日至星期六)的星期。
如果超出范围,则它将会冒泡到其他星期。
周日到周六;为一周,周日为启点;
moment().day(-7); // 上个星期日 (0 - 7)
moment().day(0); // 这个星期日 (0)
moment().day(7); // 下个星期日 (0 + 7)
7. weekday() 根据语言环境获取或设置星期几。
如果语言环境将星期一指定为一周的第一天,则 moment().weekday(0) 将会是星期一。
如果星期日是一周的第一天,则 moment().weekday(0) 将会是星期日。
// 当星期一是一周的第一天时。
moment().weekday(-7); // 上个星期一
moment().weekday(7); // 下个星期一
8. isoWeekday() 获取或设置 ISO 星期几,
其中 1 是星期一、7 是星期日。
moment().isoWeekday(1); // 星期一
moment().isoWeekday(7); // 星期日
9. dayOfYear() 获取或设置年份的日期。
接受 1 到 366 之间的数字。 如果超出范围,则它将会冒泡到年份。
10. week() 获取或设置年份的星期。
moment().weeks(Number);
moment().weeks(); // 数字
年份的星期取决于哪一天是星期的第一天(星期日、星期一等),以及哪一周是年份的第一周。
例如,在美国,星期日是星期的第一天。 1 月 1 日所在的星期是年份的第一周。
在法国,星期一是星期的第一天,且 1 月 4 日是年份的第一周。
11. isoWeek() 当设置年份的星期时,将会保留星期几。
moment().isoWeek(Number);
moment().isoWeek(); // 数字
12. month() 获取或设置月份。
接受 0 到 11 之间的数字。 如果超出范围,则它将会冒泡到年份。
注意:月份是零索引的,因此一月是月份 0。
moment().month(Number|String);
moment().month(); // 数字
13. quarter() 获取季度(1 到 4)
moment().quarter(); // 数字
moment().quarter(Number);
14. year() 获取或设置年份。
moment().year(Number);
moment().year(); // 数字
接受 -270,000 至 270,000 之间的数字。
15. weekYear() 根据语言环境获取或设置周年。
因为第一周的第一天并不总是在一年的第一天,所以有时周年与月年会有所不同。
例如,在美国,包含 1 月 1 日的星期始终是第一周。 在美国,星期也从星期日开始。
如果 1 月 1 日是星期一,则 12 月 31 日与 1 月 1 日属于同一周,因此与 1 月 1 日的周年相同。
12 月 30 日则与 12 月 31 日是不同的周年。
moment().weekYear(Number);
moment().weekYear(); // 数字
16. isoWeekYear() 获取或设置 ISO 周年。
moment().isoWeekYear(Number);
moment().isoWeekYear(); // 数字
17. weeksInYear() 根据语言环境获取当前 moment 年份的周数。
moment().weeksInYear(); //53
18. isoWeeksInYear() 根据 ISO 星期获取当前 moment 年份的周数。
19. get()
moment().get('year');
moment().get('month'); // 0 至 11
moment().get('date');
moment().get('hour');
moment().get('minute');
moment().get('second');
moment().get('millisecond');
20. set()
moment().set('year', 2013);
moment().set('month', 3); // 四月
moment().set('date', 1);
moment().set('hour', 13);
moment().set('minute', 20);
moment().set('second', 30);
moment().set('millisecond', 123);
moment().set({'year': 2013, 'month': 3});
21. max() 返回给定的 moment 实例的最大值(类似比较大小)
var a = moment().subtract(1, 'day');
var b = moment().add(1, 'day');
moment.max(a, b); // b
moment.max([a, b]); // b
22. min() 返回给定的 moment 实例的最小值
var a = moment().subtract(1, 'day');
var b = moment().add(1, 'day');
moment.min(a, b); // a
moment.min([a, b]); // a
三、 操作
一旦有了 Moment,则可能需要以某些方式对其进行操作。
Moment.js 使用流式的接口模式,也称为方法链。 这使得可以执行以下疯狂的操作。
moment().add(7, 'days').subtract(1, 'months').year(2009).hours(0).minutes(0).seconds(0);
moment 是可变的。 调用任何一种操作方法都会改变原始的 moment。
1. add(); 通过增加时间来改变原始的 moment。
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
milliseconds ms
}
如果要同时增加多个不同的键,则可以将它们作为对象字面量传入。
moment().add(7, 'days').add(1, 'months'); // 链式
moment().add({days:7,months:1}); // 对象字面量
数量没有上限,因此可以重载任何参数。
moment().add(1000000, 'milliseconds'); // 一百万毫秒
moment().add(360, 'days'); // 360 天
2. subtract() 通过减去时间来改变原始的 moment。
这与 moment#add 完全相同,只是不增加时间,而是减去时间。
moment().subtract(Number, String);
moment().subtract(Duration);
moment().subtract(7, 'days');
3. startOf()
通过将原始的 moment 设置为时间单位的开头来对其进行更改。
moment().startOf('year'); // 设置为今年一月1日 0点
moment().startOf('month'); // 设置为本月1日 0点
moment().startOf('quarter'); // 设置为当前季度的开始,即每月的第一天0点
moment().startOf('week'); // 设置为本周的第一天0点
4. endOf()
通过将原始的 moment 设置为时间单位的末尾来对其进行更改。
这与 moment.startOf 相同,只是将其设置为时间单位的末尾,而不是设置为时间单位的开头。
moment().endOf("year"); // 将 moment 设置为今年的 12 月 31 日 23:59:59.999
let obj = moment().endOf("year");
console.log(obj.get("date")); //31
console.log(obj.get("month")); // 11
console.log(obj.get("hours")); //23
四、显示
一旦解析和操作完成后,需要某些方式来显示 moment。
1. format()方法
1. format()
这是最稳健的显示选项。 它接受一串令牌并将其替换为其相应的值。
moment().format();
moment().format(String);
moment().format("YYYY"); //'2022'
moment().format("M"); //'5'
moment().format("MM"); //'05'
参数为下面列表
令牌 | 输出 | |
---|---|---|
月份 | M | 1 2 ... 11 12 |
Mo | 1st 2nd ... 11th 12th | |
MM | 01 02 ... 11 12 | |
MMM | Jan Feb ... Nov Dec | |
MMMM | January February ... November December | |
季度 | Q | 1 2 3 4 |
Qo | 1st 2nd 3rd 4th | |
月份的日期 | D 1 2 ... 30 31 | |
Do | 1st 2nd ... 30th 31st | |
DD | 01 02 ... 30 31 | |
年份的日期 | DDD | 1 2 ... 364 365 |
DDDo | 1st 2nd ... 364th 365th | |
DDDD | 001 002 ... 364 365 | |
星期几 | d | 0 1 ... 5 6 |
do | 0th 1st ... 5th 6th | |
dd | Su Mo ... Fr Sa | |
ddd | Sun Mon ... Fri Sat | |
dddd | Sunday Monday ... Friday Saturday | |
星期几(语言环境) | e | 0 1 ... 5 6 |
星期几(ISO) | E | 1 2 ... 6 7 |
年份的星期 | w | 1 2 ... 52 53 |
wo | 1st 2nd ... 52nd 53rd | |
ww | 01 02 ... 52 53 | |
年份的星期(ISO) | W | 1 2 ... 52 53 |
Wo | 1st 2nd ... 52nd 53rd | |
WW | 01 02 ... 52 53 | |
年份 | YY | 70 71 ... 29 30 |
YYYY | 1970 1971 ... 2029 2030 | |
Y | 1970 1971 ... 9999 +10000 +10001 注意:对于 9999 年以后的日期,这符合 ISO 8601 标准。 | |
周年 | gg | 70 71 ... 29 30 |
gggg | 1970 1971 ... 2029 2030 | |
周年(ISO) | GG | 70 71 ... 29 30 |
GGGG | 1970 1971 ... 2029 2030 | |
子午线 | A | AM PM |
a | am pm | |
小时 | H | 0 1 ... 22 23 |
HH | 00 | |
h | 1 2 ... 11 12 | |
hh | 01 02 ... 11 12 | |
k | 1 2 ... 23 24 | |
kk | 01 02 ... 23 24 | |
分钟 | m | 0 1 ... 58 59 |
mm | 00 01 ... 58 59 | |
秒钟 | s | 0 1 ... 58 59 |
ss | 00 01 ... 58 59 | |
小数秒钟 | S | 0 1 ... 8 9 |
SS | 00 01 ... 98 99 | |
SSS | 000 001 ... 998 999 | |
SSSS ... SSSSSSSSS | 000[0..] 001[0..] ... 998[0..] 999[0..] | |
时区 z or zz | EST CST ... MST PST 注意:从 1.6.0 版本开始,z/zz 格式的令牌已从普通的 moment 对象中弃用。 在此处了解更多信息。但是,如果将特定时区与moment-timezone 插件 一起使用,它们会起作用。 | |
Z | -07:00 -06:00 ... +06:00 +07:00 | |
ZZ | -0700 -0600 ... +0600 +0700 | |
Unix 时间戳 | X | 1360013296 |
Unix 毫秒时间戳 | x | 1360013296123 |
2.fromNow() 方法
2.fromNow()
moment().fromNow();
moment().fromNow(Boolean);
显示时间的常用方法是通过 moment.fromNow 处理。 有时称为时间间隔或相对时间。
如果传入 true,则可以获得不带后缀的值。
moment([2020, 0, 29]).fromNow(); //'2 years ago'
moment([2022, 0, 29]).fromNow(); //'3 months ago'
moment([2022, 4, 6,5,50,30]).fromNow(); //'a day ago'
下面 列出 范围:
范围 | 键 | 样本输出 |
---|---|---|
0 至 44 秒 | s | 几秒前 |
未设定 | ss | 44 秒前 |
45 至 89 秒 | m | 1 分钟前 |
90 秒至 44 分钟 | mm | 2 分钟前 ... 44 分钟前 |
45 至 89 分钟 | h | 1 小时前 |
90 分钟至 21 小时 | hh | 2 小时前 ... 21 小时前 |
22 至 35 小时 | d | 1 天前 |
36 小时至 25 天 | dd | 2 天前 ... 25 天前 |
26 至 45 天 | M | 1 个月前 |
45 至 319 天 | MM | 2 个月前 ... 10 个月前 |
320 至 547 天 (1.5 年) | y | 1 年前 |
548 天+ | yy | 2 年前 ... 20 年前 |
3.from() 方法
moment().from(Moment|String|Number|Date|Array);
moment().from(Moment|String|Number|Date|Array, Boolean);
可能想要显示 moment 与现在以外的时间的相对时间。 在这种情况下,可以使用 moment#from。
var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b) // "1 天前"
var start = moment([2007, 0, 5]);
var end = moment([2007, 0, 10]);
end.from(start); // "5 天内"
end.from(start, true); // "5 天"
4.toNow()
moment().toNow();
moment().toNow(Boolean);
显示时间的常用方法是通过 moment#toNow 处理。 有时称为时间间隔或相对时间。
moment([2020, 0, 29]).toNow(); // 2 年内
moment([2020, 0, 29]).toNow(true); // 2 年
5. to()
moment().to(Moment|String|Number|Date|Array);
moment().to(Moment|String|Number|Date|Array, Boolean);
可能想要显示 moment 与现在以外的时间的相对时间。 在这种情况下,可以使用 moment#to。
var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.to(b) // "1 天内"
// 第一个参数是可以传给 moment() 的任何值或实际的 Moment。
a.to("2007-01-29"); // "1 天内"
6.calendar()
moment().calendar(); //'Today at 5:37 PM'
7. 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);
要获取以毫秒为单位的差异,则像使用 moment#from 一样使用 moment#diff。
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b) // 86400000
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') // 1
支持的度量有 years、months、weeks、days、hours、minutes 和 seconds。
8.valueOf()
moment().valueOf();
+moment();
moment#valueOf 简单地输出自 Unix 纪元以来的毫秒数,就像 Date#valueOf 一样。
moment(1318874398806).valueOf(); // 1318874398806
+moment(1318874398806); // 1318874398806
9.daysInMonth()
moment().daysInMonth();
获取当月的天数。
moment("2012-02", "YYYY-MM").daysInMonth() // 29
moment("2012-01", "YYYY-MM").daysInMonth() // 31
10. toDate()
moment().toDate();
要获取 Moment.js 封装的原生 Date 对象的副本,则使用 moment#toDate。
这将会返回该 moment 使用的 Date 的副本,因此对该 Date 的任何更改都不会导致 moment 发生变
11. toArray()
moment().toArray();
这会返回一个数组,该数组反映了 new Date() 中的参数。
moment().toArray(); // [2022, 4, 7, 22, 44, 21, 867]
12. toObject()
moment().toObject();
这会返回一个包含年份、月份、月份的日期、小时、分钟、秒钟、毫秒的对象。
13. toString()
moment().toString();
以与 JS Date 的 .toString() 类似的格式返回英文字符串。
moment().toString() // 'Sat May 07 2022 22:47:30 GMT+0800'
五、查询
1. isBefore
moment().isBefore(Moment|String|Number|Date|Array);
moment().isBefore(Moment|String|Number|Date|Array, String);
检查一个 moment 是否在另一个 moment 之前。 第一个参数会被解析为 moment(如果尚未解析)。
moment('2022-10-20').isBefore('2022-10-21'); // true
如果要将粒度限制为毫秒以外的单位,则将单位作为第二个参数传入。
moment('2010-10-20').isBefore('2010-12-31', 'year'); // false
moment('2010-10-20').isBefore('2011-01-01', 'year'); // true
如果未将任何内容传给 moment#isBefore,则它将会默认为当前时间。
注意:moment().isBefore() 具有未定义的行为,且不应被使用! 如果代码运行快速,则初始创建的 moment 将会与isBefore 中创建的要执行检查的相同,因此结果将会为 false。 但是,如果代码运行速度较慢,则有可能在 isBefore 中创建的 moment 可测量地在 moment() 中创建的之后,因此该调用将会返回 true。
2. isSame()
moment().isSame(Moment|String|Number|Date|Array);
moment().isSame(Moment|String|Number|Date|Array, String);
检查一个 moment 是否与另一个 moment 相同。 第一个参数会被解析为 moment(如果尚未解析)。
moment('2010-10-20').isSame('2010-10-20'); // true
如果要将粒度限制为毫秒以外的单位,则将单位作为第二个参数传入。
moment('2010-10-20').isSame('2009-12-31', 'year'); // false
moment('2010-10-20').isSame('2010-01-01', 'year'); // true
moment('2010-10-20').isSame('2010-12-31', 'year'); // true
moment('2010-10-20').isSame('2011-01-01', 'year'); // false
当包含第二个参数时,则它将会匹配所有等于或更大的单位。 传入 month 将会检查 month 和 year。 传入 day 将会检查 day、month 和 year。
moment('2010-01-01').isSame('2011-01-01', 'month'); // false, 不同的年份
moment('2010-01-01').isSame('2010-02-01', 'day'); // false, 不同的月份
3. isAfter()
moment().isAfter(Moment|String|Number|Date|Array);
moment().isAfter(Moment|String|Number|Date|Array, String);
检查一个 moment 是否在另一个 moment 之后。 第一个参数会被解析为 moment(如果尚未解析)。
moment('2010-10-20').isAfter('2010-10-19'); // true
如果要将粒度限制为毫秒以外的单位,则将单位作为第二个参数传入。
moment('2010-10-20').isAfter('2010-01-01', 'year'); // false
4. isSameOrBefore()
moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrBefore(Moment|String|Number|Date|Array, String);
检查一个 moment 是否在另一个 moment 之前或与之相同。 第一个参数会被解析为 moment(如果尚未解析)。
moment('2010-10-20').isSameOrBefore('2010-10-21'); // true
moment('2010-10-20').isSameOrBefore('2010-10-20'); // true
moment('2010-10-20').isSameOrBefore('2010-10-19'); // false
如果要将粒度限制为毫秒以外的单位,则将单位作为第二个参数传入。
moment('2010-10-20').isSameOrBefore('2009-12-31', 'year'); // false
5. isSameOrAfter()
moment().isSameOrAfter(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array, String);
检查一个 moment 是否在另一个 moment 之后或与之相同。 第一个参数会被解析为 moment(如果尚未解析)。
moment('2010-10-20').isSameOrAfter('2010-10-19'); // true
如果要将粒度限制为毫秒以外的单位,则将单位作为第二个参数传入。
moment('2010-10-20').isSameOrAfter('2011-12-31', 'year'); // false
6. isBetween()
moment().isBetween(moment-like, moment-like);
moment().isBetween(moment-like, moment-like, String);
moment().isBetween(moment-like, moment-like, String, String);
检查一个 moment 是否在其他两个 moment 之间,可选地检查指定的单位刻度(分钟,小时,日期等)。 这个匹配是排他的。 前两个参数会被解析为 moment(如果尚未解析)。
moment('2010-10-20').isBetween('2010-10-19', '2010-10-25'); // true
如果要将粒度限制为毫秒以外的单位,则将单位作为第三个参数传入。
moment('2010-10-20').isBetween('2010-01-01', '2012-01-01', 'year'); // false
// 2.13.0 版本引入了包容性。 [ 表示包含。 ( 表示排除。 如果使用包容性参数,则必须传入两个指示符。
moment('2016-10-30').isBetween('2016-10-30', '2016-12-30', null, '()'); //false
moment('2016-10-30').isBetween('2016-10-30', '2016-12-30', null, '[)'); //true
moment('2016-10-30').isBetween('2016-01-01', '2016-10-30', null, '()'); //false
moment('2016-10-30').isBetween('2016-01-01', '2016-10-30', null, '(]'); //true
moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
如果未指定包容性参数,则 Moment 将会默认为 ()。
7. isDST()
moment().isDST();
moment#isDST 检查当前时刻是否为夏令时(daylight saving time)。
moment([2022, 5, 12]).isDST(); // false, 2011年3月12日不是 DST。
8. isLeapYear()
moment().isLeapYear();
如果该年是闰年,则 moment#isLeapYear 返回 true,否则返回 false。
moment([2000]).isLeapYear() // true
moment([2001]).isLeapYear() // false
moment([2100]).isLeapYear() // false
9. isMoment()
moment.isMoment(obj);
要检查变量是否为 moment 对象,则使用 moment.isMoment()。
moment.isMoment() // false
moment.isMoment(new Date()) // false
moment.isMoment(moment()) // true
10. isDate()
moment.isDate(obj);
要检查变量是否为原生 js Date 对象,则使用 moment.isDate()。
moment.isDate(); // false
moment.isDate(new Date()); // true
moment.isDate(moment()); // false
六、国际化
Moment.js 对国际化具有强大的支持。
可以加载多个语言环境并在它们之间轻松地切换。
除了分配全局的语言环境外,还可以将语言环境分配给特定的 moment。
moment.locale(String);
moment.locale(String[]);
moment.locale(String, Object);
moment.locale('zh-cn'); // 设置全局的语言环境。
···