时间日期库:moment

moment 官网:http://momentjs.cn

GitHub:https://github.com/moment/moment/

安装及使用

安装: yarn add moment

使用:

var moment = require('moment');
// or
import moment from 'moment';

Moment 对象

使用 moment() 可直接创建一个 Moment 对象。

此函数支持以下几种参数:

  • Date 对象
  • String 时间格式的字符串
  • 对象({ y, M, d, h, m, s, ms })
  • 数组(Number[])
  • Unix 偏移量 (毫秒)
  • 字符串 + 格式
  • 另一个 Moment 对象
moment(); // 创建当前时间的 Moment 对象,同 moment(new Date())
moment("1995-06-08"); // 创建指定时间的 Moment 对象
moment('2013-02-08 09:30:26.123'); // 带年月日时分秒毫秒的初始化 Moment 对象,可以下往上逐一省略
moment({ hour:15, minute:10 });
moment({ y    :2010, M     :3, d   :5, h    :15, m      :10, s      :3, ms          :123});
moment({ year :2010, month :3, day :5, hour :15, minute :10, second :3, millisecond :123});
moment([2010, 1, 14, 15, 25, 50, 125]);
moment.utc([2010, 1, 14, 15, 25, 50, 125]);
moment(1318781876406); // 使用时间戳(ms)创建 Moment 对象
moment.unix(1318781876); // 使用时间戳(s)创建 Moment 对象
moment.unix(1318781876.721);
moment("12/25/1995", "MM-DD-YYYY"); // 使用指定格式创建 Moment 对象
moment(moment([2012])); // 从另一个 Moment 对象创建(克隆)

格式包括以下值:

Input Example Description
YYYY 2014 4 or 2 digit year
YY 14 2 digit year
Q 1..4 Quarter of year. Sets month to first month in quarter.
M MM 1..12 Month number
MMM MMMM Jan..December Month name in locale set by moment.locale()
D DD 1..31 Day of month
Do 1st..31st Day of month with ordinal
DDD DDDD 1..365 Day of year
X 1410715640.579 Unix timestamp
x 1410715640579 Unix ms timestamp
---------- -------------- -------------------------------------------
gggg 2014 Locale 4 digit week year
gg 14 Locale 2 digit week year
w ww 1..53 Locale week of year
e 1..7 Locale day of week
ddd dddd Mon...Sunday Day name in locale set by moment.locale()
GGGG 2014 ISO 4 digit week year
GG 14 ISO 2 digit week year
W WW 1..53 ISO week of year
E 1..7 ISO day of week
------ ------------ ----------------------------------------------
H HH 0..23 24 hour time
h hh 1..12 12 hour time used with a A.
a A am pm Post or ante meridiem
m mm 0..59 Minutes
s ss 0..59 Seconds
S 0..9 Tenths of a second
SS 0..99 Hundreds of a second
SSS 0..999 Thousandths of a second
SSSS 0000..9999 fractional seconds
Z ZZ +12:00 Offset from UTC as +-HH:mm, +-HHmm, or Z
------ ------------ ----------------------------------------------

转化

转化为 Date 对象

moment().toDate();

转化为数组

moment().toArray(); // [2018, 7, 14, 14, 40, 16, 154];

转化为 JSON

moment().toJSON();

转化为对象

moment().toObject();

合法性校验

使用 isValid 可以判断 Moment 对象的有效性。

moment('2013-02-08 09:30:26.123').isValid() // true
moment("not a real date").isValid() // false

使用 invalidAt 可以返回错误的位置

var m = moment("2011-10-10T10:20:90");
m.isValid(); // false
m.invalidAt(); // 5 for seconds

返回值意义:

0 years
1 months
2 days
3 hours
4 minutes
5 seconds
6 milliseconds

设置默认值

moment();  // current date and time
moment(5, "HH");  // today, 5:00:00.000
moment({hour: 5});  // today, 5:00:00.000
moment({hour: 5, minute: 10});  // today, 5:10.00.000
moment({hour: 5, minute: 10, seconds: 20});  // today, 5:10.20.000
moment({hour: 5, minute: 10, seconds: 20, milliseconds: 300});  // today, 5:10.20.300
moment(5, "DD");  // this month, 5th day-of-month
moment("4 05:06:07", "DD hh:mm:ss");  // this month, 4th day-of-month, 05:06:07.000
moment(3, "MM");  // this year, 3th month (April)
moment("Apr 4 05:06:07", "MMM DD hh:mm:ss");  // this year, 5th April, 05:06:07.000

取值与赋值

年月日

moment().millisecond(Number) === new Date().getMilliseconds(Number) // 设置毫秒
moment().millisecond() === new Date().getMilliseconds() // 获取毫秒
moment().millisecond() === moment().milliseconds()
moment().second(Number) === new Date().setSeconds(Number) // 设置秒
moment().second() === new Date().getSeconds() // 获取秒
moment().second() === moment().seconds()
moment().minute(Number) === new Date().getMinutes(Number) // 设置分钟
moment().minute() === new Date().getMinutes() // 获取分钟
moment().minute() === moment().minutes()
moment().hour(Number) === new Date().getHours(Number) // 设置小时
moment().hour() === new Date().getHours() // 获取小时
moment().hour() === moment().hours()
moment().date(Number) === new Date().getDate(Number) // 设置日期
moment().date() === new Date().getDate() // 获取日期
moment().date() === moment().dates()
moment().month(Number|String) === new Date().getMonth(Number|String) // 设置月
moment().month() === new Date().getMonth() // 获取月
moment().month() === moment().months()
// 注释:0 为 1 月,0 为 2 月,类推
moment().month("January").month() // 0
moment().year(Number) === new Date().getFullYear(Number) // 设置年
moment().year() === new Date().getFullYear() // 获取月
moment().year() === moment().years()

注释

月份的写法与简写

"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"

"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"

星期

moment().day(Number|String) // 设置星期
moment().day() // 获取星期
moment().day() === moment().days()
moment().day(-7); // last Sunday (0 - 7)
moment().day(7); // next Sunday (0 + 7)
moment().day(10); // next Wednesday (3 + 7)
moment().day(24); // 3 Wednesdays from now (3 + 7 + 7 + 7)
moment().day("Sunday");
moment().day("Monday");
moment().weekday(Number); // 设置星期(区域标准)
moment().weekday();
// when Monday is the first day of the week
moment().weekday(-7); // last Monday
moment().weekday(7); // next Monday
// when Sunday is the first day of the week
moment().weekday(-7); // last Sunday
moment().weekday(7); // next Sunday
moment().isoWeekday(Number); // 设置星期(ISO)
moment().isoWeekday();
moment().isoWeekday(1); // Monday
moment().isoWeekday(7); // Sunday
moment().dayOfYear(Number); // 设置一年中的第几天
moment().dayOfYear(); // 获取一年中的第几天
moment().week(Number); // 设置一年中的第几周
moment().week(); // 获取一年中的第几周
moment().week() === moment().weeks()

注释

星期的写法与简写

"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"

"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"

"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"

UTC

moment.utc().seconds(30) === new Date().setUTCSeconds(30); // 设置 utc 秒
moment.utc().seconds()   === new Date().getUTCSeconds(); // 获取 utc 秒

赋值

使用 set 可直接对指定字段进行赋值。

moment().set(String, Int);
moment().set(Object(String, Int));

举例:

moment().set('year', 2013);
moment().set('month', 3);  // April
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});

获取

使用 get 可以获取指定字段的值。

moment().get(unit);

unit

var m = moment();
m.get('y');
m.get('year');
m.get('years');

关键字可以进行简写:

Key Shorthand
years y
quarters Q
months M
weeks w
days d
hours h
minutes m
seconds s
milliseconds ms

时间戳

moment().valueOf(); // 获取 Unix 时间戳 (秒)
moment().unix(); // 获取 Unix 时间戳 (秒)

format

使用 format 对 Moment 进行格式化。

moment().format(); // 返回格式化的当前时间,格式:2018-07-17T21:16:25+08:00
moment().format(String); // 使用指定字符串格式化时间
moment().format('YYYY-MM-DD'); // 2018-07-18
moment().format('YYYY-MM-DD hh:mm:ss'); // 2018-07-18 09:48:21

格式化字串

格式化字串包括:

Token Output
Month 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
Quarter Q 1 2 3 4
Day of Month D 1 2 ... 30 31
Do 1st 2nd ... 30th 31st
DD 01 02 ... 30 31
Day of Year DDD 1 2 ... 364 365
DDDo 1st 2nd ... 364th 365th
DDDD 001 002 ... 364 365
Day of Week 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
Day of Week (Locale) e 0 1 ... 5 6
Day of Week (ISO) E 1 2 ... 6 7
Week of Year w 1 2 ... 52 53
wo 1st 2nd ... 52nd 53rd
ww 01 02 ... 52 53
Week of Year (ISO) W 1 2 ... 52 53
Wo 1st 2nd ... 52nd 53rd
WW 01 02 ... 52 53
Year YY 70 71 ... 29 30
YYYY 1970 1971 ... 2029 2030
Week Year gg 70 71 ... 29 30
gggg 1970 1971 ... 2029 2030
Week Year (ISO) GG 70 71 ... 29 30
GGGG 1970 1971 ... 2029 2030
AM/PM A AM PM
a am pm
Hour H 0 1 ... 22 23
HH 00 01 ... 22 23
h 1 2 ... 11 12
hh 01 02 ... 11 12
Minute m 0 1 ... 58 59
mm 00 01 ... 58 59
Second s 0 1 ... 58 59
ss 00 01 ... 58 59
Fractional Second 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..]
Unix Timestamp X 1360013296
Unix Millisecond Timestamp x 1360013296123

时间查询

是否之前

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

举例:

moment('2010-10-20').isBefore('2010-10-21'); // true
moment('2010-10-20').isBefore('2010-12-31', 'year'); // false
moment('2010-10-20').isBefore('2011-01-01', 'year'); // true

第二参数支持,可使用

year month week day hour minute second

用于判断 指定的起始比较字段(如果相同,则比较之后的字段)时候在此之前。

是否之后

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

举例:

moment('2010-10-20').isAfter('2010-10-19'); // true
moment('2010-10-20').isAfter('2010-01-01', 'year'); // false
moment('2010-10-20').isAfter('2009-12-31', 'year'); // true

是否之间

moment().isBetween(moment-like, moment-like);
moment().isBetween(moment-like, moment-like, String);
// where moment-like is Moment|String|Number|Date|Array

举例:

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
moment('2010-10-20').isBetween('2009-12-31', '2012-01-01', 'year'); // true

是否闰年

moment().isLeapYear();

举例:

moment([2000]).isLeapYear() // true
moment([2001]).isLeapYear() // false
moment([2100]).isLeapYear() // false

是否是 Moment 对象

moment.isMoment(obj);

举例:

moment.isMoment() // false
moment.isMoment(new Date()) // false
moment.isMoment(moment()) // true

是否是 Date 对象

moment.isDate(obj);

举例:

moment.isDate(); // false
moment.isDate(new Date()); // true
moment.isDate(moment()); // false

时间操作

增加、减少

加法

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

减法

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

示例:

moment().subtract(1, 'day');
moment().add(1, 'day');

可以进行链式操作:

moment().add(7, 'days').subtract(1, 'months').year(2009).hours(0).minutes(0).seconds(0);
// 以下两种写法等效
moment().add(7, 'days').add(1, 'months');
moment().add({days:7,months:1});
moment().add(7, 'd');

比较

可以使用比较运算符直接比较两个 Moment 的大小

var m = moment() // 2018-07-16
var p = moment([2017, 1, 1])
var k = moment([2019, 1, 1])
console.log(
  m > p, // true
  m > k  // false
)

最大值和最小值

var a = moment().subtract(1, 'day');
var b = moment().add(1, 'day');
moment.max(a, b);  // b
moment.min(a, b);  // a

开始时间和结束时间

设置开始时间和结束时间

moment().startOf(String);
moment().endOf(String);

示例:

moment().startOf('year');    // set to January 1st, 12:00 am this year
moment().startOf('month');   // set to the first of this month, 12:00 am
moment().startOf('quarter');  // set to the beginning of the current quarter, 1st day of months, 12:00 am
moment().startOf('week');    // set to the first day of this week, 12:00 am
moment().startOf('isoWeek'); // set to the first day of this week according to ISO 8601, 12:00 am
moment().startOf('day');     // set to 12:00 am today
moment().startOf('hour');    // set to now, but with 0 mins, 0 secs, and 0 ms
moment().startOf('minute');  // set to now, but with 0 seconds and 0 milliseconds
moment().startOf('second');  // same as moment().milliseconds(0);
moment().endOf("year"); // set the moment to 12-31 11:59:59.999 pm this year
// usage same as startOf

举例:

当前时间为 '2018-07-18 11:44:26'

moment().startOf('year') // Mon Jan 01 2018 00:00:00 GMT+0800 (CST)
moment().startOf('month') // Sun Jul 01 2018 00:00:00 GMT+0800 (CST)
moment().startOf('day') // Wed Jul 18 2018 00:00:00 GMT+0800 (CST)
moment().startOf('hour') // Wed Jul 18 2018 11:00:00 GMT+0800 (CST)
moment().startOf('minute') // Wed Jul 18 2018 11:44:00 GMT+0800 (CST)
moment().startOf('second') // Wed Jul 18 2018 11:44:26 GMT+0800 (CST)

时差

使用 diff 函数可以算出两个 Moment 对象之间的时差(毫秒)。

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

示例:

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b) // 86400000

参考资料

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress