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');  // 设置全局的语言环境。

···
posted @ 2022-05-07 23:36  kgwei  阅读(471)  评论(0编辑  收藏  举报