Moment.js中文文档系列之三日期时间的加减等操作(Manipulate)

 2015年10月18日    22716     声明


创建Moment对象后,有时需要对其进行一些加减等操作,Moment中提供了一些方法来完成这些操作。

Moment使用了连续接口模式,也叫做方法链。这让你可以像这样像下面这样进行方法调用:

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


1. 加法(Add)

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

对原moment进行时间增加操作。

这是一个优雅而健壮的方法,使你可以对已经存在的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'); // 100万毫秒
moment().add(360, 'days'); // 30天

对月和年的特殊考虑

当增加月后,如果目标月的天数超过出最大值,将变为目标月的最后一天:

moment([2010, 0, 31]);                  // 1月31
moment([2010, 0, 31]).add(1, 'months'); // 2月28

当为夏令时增加时间时也会有特殊考虑。当增加年、月、周或天时,原来的小时会匹配增加后时间的小时:

var m = moment(new Date(2011, 2, 12, 5, 0, 0)); // 美国夏令时前的一天
m.hours(); // 5
m.add(24, 'hours').hours(); // 6

当为夏令时增加小时、分钟、秒或毫钞时,如你想增加一个明确的小时数,返回值会返回一个不同的小时数:

var m = moment(new Date(2011, 2, 12, 5, 0, 0)); // 美国夏令时前的一天
m.hours(); // 5
m.add(24, 'hours').hours(); // 6


2. 减法(Subtract)

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

对原moment进行时间减少操作。

减少时间的方法与增加时间的方法moment().add()相似,只是把增加时间变成了减少时间:

moment().subtract(7, 'days');


3. 开始时间 (Start of Time)

moment().startOf(String);

对原moment设置为某一时间的单位的起始时间。

moment().startOf('year');    // 设置为今年1月第一天的 12:00 am
moment().startOf('month');   // 设置为本月第一天的 12:00 am
moment().startOf('quarter');  // 设置为本季度第一个月第一天的 12:00 am
moment().startOf('week');    // 设置为本周第一天的 12:00 am
moment().startOf('isoWeek'); // 设置为ISO本周的第一天的 12:00 am
moment().startOf('day');     // 设置为今天的 12:00
moment().startOf('hour');    // 设置为当前时间的小时,0分0秒0毫秒
moment().startOf('minute');  // 设置为当前的时间的分钟,according
moment().startOf('second');  // 类似 moment().milliseconds(0);

这些设置在本质上是一些快捷方法:

moment().startOf('year');
moment().month(0).date(1).hours(0).minutes(0).seconds(0).milliseconds(0);
moment().startOf('hour');
moment().minutes(0).seconds(0).milliseconds(0);

对原moment设置为某一时间的单位的结束时间。

4. 结束时间 (End of Time)

moment().endOf(String);

moment().startOf()相同,只是将开始时间变成了结束时间:

moment().endOf("year"); // 设置为今年的 12-31 11:59:59.999 pm


5. 最大值(Maximum)

moment().max(Moment|String|Number|Date|Array);

将当前moment时间设置为和另一个moment时间相比较大值的一个,a.max(b)与a = moment.min(a, b)相同。

这是和moment.min相对的一方法:

var momentFromServer = moment(input);
var clampedMoment = momentFromServer.max();

通过moment.max方法与任意格式的有时间,与moment()取最大值:

moment().max(moment().add(1, 'd'));
moment().max("2013-04-20T20:00:00+0800");
moment().max("Jan 1 2001", "MMM D YYYY");
moment().max(new Date(2012, 1, 8));


6. 最小值(Minimum)

moment().min(Moment|String|Number|Date|Array);

将当前moment时间设置为和另一个moment时间相比较小值的一个,a.min(b)与a = moment.max(a, b)相同。

这是和moment.max相对的一方法:

moment().min("2013-04-20T20:00:00+0800");

通过moment.max方法,可以对moment进行各级别的时间设置:

var start  = moment().startOf('week');
var end    = moment().endOf('week');
var actual = moment().min(start).max(end);


7. 本地化(Local)

moment().local();

对原moment时间设置一个标志,对其内部使用Date#get*Date#set*代替Date#getUTC*Date#setUTC*

var a = moment.utc([2011, 0, 1, 8]);
a.hours(); // 8 UTC
a.local();
a.hours(); // 0 PST

UTC模式请参考:moment.utc()


8. UTC

moment().utc();

对原moment时间设置一个标志,对其内部使用Date#getUTC*Date#setUTC*代替Date#get*Date#set*

UTC模式请参考:moment.utc()


9. UTC 偏移量(UTC Offset)

moment().utcOffset();
moment().utcOffset(Number|String);

设置或获取一个以分为单位的UTC偏移量。

获取当前对象的UTC偏移量:

moment().utcOffset(); // (-240, -120, -60, 0, 60, 120, 240, etc.)

对当前时间设置一个明确的UTC 偏移分钟数。设置分钟数后,其本身并不会发生改变。如果你要使用某地的时区时间,要用moment-timezone进行设置:

moment().utcOffset(120);

当输入小于16且小于-16时,moment会理解为输入的是小时:

moment().utcOffset(8);  // 设置小时偏移量
moment().utcOffset(480);  // 设置分钟偏移量 (8 * 60)

也可以通过字符串形式进行设置:

moment().utcOffset("+08:00");
moment().utcOffset(8);
moment().utcOffset(480);

当通过字符串进行设置时,moment().utcOffset会首先匹配+00:00 +0000 -00:00 -0000,即使你输入了ISO 8601格式的字符串,moment也会将成变成这个UTC 偏移量。

输入的字符串要以+-的形式开头,如果不以这种形式开头会被解释为"+00:00"

moment().utcOffset("2013-03-07T07:00:00+08:00");


10. 时区偏移量(Timezone Offset)

moment().zone();
moment().zone(Number|String);

设置或获取一个以分钟为单位的时区偏移量。

moment().zone(); // (60, 120, 240, etc.)

当输入小于16且小于-16时,moment会理解为输入的是小时:

// 以下是同一种设置方式
moment().zone(480);
moment().zone(8);

也可以通过字符串形式进行设置:

moment().zone("-08:00");

当通过字符串进行设置时,moment().zone会首先匹配+00:00 +0000 -00:00 -0000,即使你输入了ISO 8601格式的字符串,moment也会将成变成这个时区偏移量。

moment().zone("2013-03-07T07:00:00-08:00");