使用Moment.js处理日期

目录

各个浏览器对 Date.parse 的实现不一致,如果需要解析日期字符串,最好使用独立的 js 库。
Moment.js 就是一个解析、验证、操控和显示日期的js库。
项目主页://momentjs.com/
Github主页:https://github.com/moment/moment/

安装

Node.js

npm install moment
var moment = require('moment');
moment().format();

ES6

npm install moment

在使用 Moment.js 的模块中导入 moment。

import moment from 'moment';
moment().format();

下面只介绍最简单的用法,详细用法请参考官方文档。

解析

当前时刻

直接调用,返回表示当前时间的 Moment 对象。等同于 {js}moment(new Date()){/js}

moment();

解析字符串

moment(String);

先按匹配 ISO 8601,如果没有合适的格式,再使用 {js}new Date(string){/js} 创建日期。

moment("2016-11-25")

 
可以调用{js}isValid{/js}方法检测日期是否有效。

>moment("not a valid date").isValid()
false

解析提供格式的字符串

moment(String, String);

为了实现精确解析,推荐使用该方法。

moment("2016-11-25T13:41:00 +0000", "YYYY-MM-DDTHH:mm:ss Z")


格式字段如下:
年月日
 

InputExampleDescription
YYYY20144 or 2 digit year
YY142 digit year
Y-25Year with any number of digits and sign
Q1..4Quarter of year. Sets month to first month in quarter.
M MM1..12Month number
MMM MMMMJan..DecemberMonth name in locale set by moment.locale()
D DD1..31Day of month
Do1st..31stDay of month with ordinal
DDD DDDD1..365Day of year
X1410715640.579Unix timestamp
x1410715640579Unix ms timestamp

InputExampleDescription
gggg2014Locale 4 digit week year
gg14Locale 2 digit week year
w ww1..53Locale week of year
e0..6Locale day of week
ddd ddddMon...SundayDay name in locale set by moment.locale()
GGGG2014ISO 4 digit week year
GG14ISO 2 digit week year
W WW1..53ISO week of year
E1..7ISO day of week

时分秒及时区

InputExampleDescription
H HH0..2324 hour time
h hh1..1212 hour time used with a A.
a Aam pmPost or ante meridiem (Note the one character a p are also considered valid)
m mm0..59Minutes
s ss0..59Seconds
S SS SSS0..999Fractional seconds
Z ZZ+12:00Offset from UTC as +-HH:mm+-HHmm, or Z

 

显示

使用本地格式显示或者指定格式

moment.format()
moment.format(String)

解析字符串的格式同样适用,并且format还提供其他格式选项。详情请参看官方文档。

w.format()
"2016-11-25T21:41:00+08:00"
w.format("YYYY-MM-DD HH:mm:ss")
"2016-11-25 21:41:00"

时间做差

Moment.js 可以直接显示时间做差的结果。

>moment().fromNow();
"a few seconds ago"
>moment('2016-11-25 13:00:00').fromNow()
"an hour ago"

详细显示如下表所示:
 

RangeKeySample Output
0 to 45 secondssa few seconds ago
45 to 90 secondsma minute ago
90 seconds to 45 minutesmm2 minutes ago … 45 minutes ago
45 to 90 minuteshan hour ago
90 minutes to 22 hourshh2 hours ago … 22 hours ago
22 to 36 hoursda day ago
36 hours to 25 daysdd2 days ago … 25 days ago
25 to 45 daysMa month ago
45 to 345 daysMM2 months ago … 11 months ago
345 to 545 days (1.5 years)ya year ago
546 days+yy2 years ago … 20 years ago

计算两个时间点的时间差。

moment('2016-11-25 13:00:00').from(moment('2016-11-25 13:10:00'))
"10 minutes ago"

反向做差

moment('2016-11-25 13:00:00').to(moment('2016-11-25 13:10:00'))
"in 10 minutes"

操控

实现对日期的操控,比如一周前的时间:

moment().format()
"2016-11-25T14:41:13+08:00"
moment().subtract(1,'weeks').format()
"2016-11-18T14:41:26+08:00"

支持链式调用

moment().add(7, 'days').subtract(1, 'months').year(2009).hours(0).minutes(0).seconds(0);

详细请参看文档。

本地化

提供大量国际化文件,方便切换。例如设为简体中文:

>moment.locale('zh-cn');
"zh-cn"
>moment('2016-11-25 13:00:00').from(moment('2016-11-25 13:10:00'))
"10 分钟前"

使用本地化功能,需要加载对应的本地化脚本,例如简体中文的脚本是 {code}locale/zh-cn.js{/code}

参考

Moment.js 官方文档