Moment.js - 添加天数时的奇怪行为

时间:2016-09-19 11:43:43

标签: javascript angularjs momentjs

我试图在10月(2016年)的一个循环中增加1天但是有一种奇怪的行为。 2016年10月15日抵达时,它不会增加1天,仅需23个小时。

var date = moment("2016-09-25");
for (var j = 0; j < 42; j++) {
    console.log('before: ' + date.format());
    date = date.clone();
    date.add(1, 'day');
    console.log('after: ' + date.format());
}

控制台:

  

之后:2016-10-13T00:00:00-03:00

     

之前:2016-10-13T00:00:00-03:00

     

之后:2016-10-14T00:00:00-03:00

     

之前:2016-10-14T00:00:00-03:00

     

之后:2016-10-15T00:00:00-03:00

     

之前:2016-10-15T00:00:00-03:00

     

之后:2016-10-15T23:00:00-03:00

     

之前:2016-10-15T23:00:00-03:00

     

之后:2016-10-16T23:00:00-02:00

     

之前:2016-10-16T23:00:00-02:00

https://jsfiddle.net/7bxqo0m2/

2 个答案:

答案 0 :(得分:3)

那是因为10月是夏令时生效,从而将你的时间缩短了1小时

请阅读const Component = {init() {}} const x = Object.create(Component) const y = Object.create(Component) console.log(x.init === y.init) //true function createComponent(data) { return { init() { return data } } } const p = createComponent('a') const q = createComponent('b') console.log(p.init === q.init) //false console.log(p.init()) //a console.log(q.init()) //b 的构造函数here并查看momentmoment.utc

答案 1 :(得分:1)

这里的问题是巴西在午夜进行夏令时,这使“白昼”的概念混淆不清。 Moment试图做的是将当天设置为当天的当天时间=原始日+ 1。

问题在于,当它创建一个JS日期为2013-10-20T00:00:00时,基础日期库会混淆,因为巴西不存在该时间。浏览器的行为有所不同,但这是Node和Chrome中的行为:

d = moment('2016-10-19').toDate(); //get the native date object
d.setDate(18); //use the native API to set the date
d; // Fri Oct 18 2016 00:00:00 GMT-0300 (BRT), so works fine

//but
d = moment('2016-10-19').toDate(); //get the native date object
d.setDate(20);
d; // Sat Oct 19 2016 23:00:00 GMT-0300 (BRT), WTF?

我更改了endOf()的开始日期并解决了问题

date.endOf('day');