Moment.js使用夏令时添加天数

时间:2014-01-23 20:12:13

标签: javascript date momentjs

在Moment.js中我遇到了下一个问题:

1.我创建了一个时刻日期:

var m = moment(new Date(2014, 9, 18, 0, 0, 0));

2.如果我调用toString函数:

m.toString() //"Sat Oct 18 2014 00:00:00 GMT-0300"

3.现在,我添加一天我有下一个输出:

m.add("days",1).toString() //"Sat Oct 18 2014 00:00:00 GMT-0300"

我又得到了什么? Momentjs应该更改日期。

编辑:Chrome 32.0.1700.76 m中的问题

EDIT2:MomentJs版本2.5.1

EDIT3:时区UTC-3

6 个答案:

答案 0 :(得分:15)

我看过你的代码,起初我没有得到相同的结果。然而,当我将时区改为巴西(格林威治标准时间03:00) - 圣保罗时,我得到了相同的结果。这显然是一个错误,现在已被追溯到V8并报告。

Plunker

var m = moment(new Date(2014, 9, 18, 0, 0, 0));
console.log(m.toString());
console.log(m.add("days",1).toString());
  

2014年10月18日星期六00:00:00 GMT-0300 script.js:4

     

2014年10月18日星期六00:00:00 GMT-0300 script.js:5

我提交了一个错误:https://github.com/moment/moment/issues/1440

<强>更新

Moment.js不对此错误负责。它已被跟踪到V8(Chrome和Node使用的javascript引擎)中的错误。我已经向V8提交了一个错误,您可以在此处跟踪:https://code.google.com/p/v8/issues/detail?id=3116

以下是艾萨克·坎布朗为追踪它所做的工作。

好的,现在在Ubuntu和OSX中重现(之前我在我的测试中使用了不同的巴西城市)。我使用的是Node,而不是Chrome,但出于我们的目的,V8是V8。

moment([2014, 9, 18]).add(1, 'd').format(); //=> '2014-10-18T00:00:00-03:00'

问题在于,Moment基本上是这样做的:

var d = new Date(2014, 9, 18);
d.setDate(19);
d.toString(); // => Sat Oct 18 2014 23:00:00 GMT-0300 (BRT)
//wtf?

然后它将小时设置为零。由于V8奇怪地将时间设定为10月18日晚,即使我们特别要求将其设置为10月19日,但答案出错了。这一切都特别奇怪,因为这里的DST转换是向前跳转,这意味着它应该在前一天的1:00而不是23:00结束。

事实上,它甚至会这样做:

new Date("October 18, 2014"); //=> Sat Oct 18 2014 00:00:00 GMT-0300 (BRT)
new Date("October 19, 2014"); //=> Sat Oct 18 2014 23:00:00 GMT-0300 (BRT)

答案 1 :(得分:3)

根据这个jsFiddle,你正在做什么/应该/正在工作。您正在测试哪种浏览器?

http://jsfiddle.net/mori57/Nq3KD/

var m = moment(new Date(2014, 9, 18, 0, 0, 0));
console.log(m.toString()); // Firebug output: Sat Oct 18 2014 00:00:00 GMT-0400
console.log(m.add("days",1).toString()); // output: Sun Oct 19 2014 00:00:00 GMT-0400

答案 2 :(得分:3)

您只需使用以下代码即可在moment.js

中获取下一个日期
var date='2014/09/18';
var nextDate = moment(date, 'YYYY/MM/DD').add('days', 1).format('YYYY/MM/DD');
console.log(nextDate); // 2014/09/19

有关详情,请参阅以下链接

momentjs docs

答案 3 :(得分:1)

这是一个相当古老的帖子,但我通过谷歌来到这里同样的问题。我最终使用的是以下代码,也许这对其他人有用:

    var then = moment("23.07.2014", "DD.MM.YY");
    var before = moment.unix(then.unix()-86400); // 86400 seconds/day
    var after = moment.unix(then.unix()+86400);

答案 4 :(得分:1)

您应首先传递号码,然后传递“天”

var m = moment(new Date(2014, 9, 18, 0, 0, 0));
console.log(m.toString());
console.log(m.add(1, "days").toString());

在Chrome版本50.0.2661.37 beta-m(64位)

中测试

答案 5 :(得分:0)

一般注释,以避免这样的问题(你可以看到,他们发生,有时由于浏览器错误而发生):如果你代表使用Date对象,您可以将约定传递给中午(12h00)而不是午夜(00h00)到Date构造函数,然后在准备日期的函数中用于显示,切断它。

浏览器中的错误以及因DST引起的问题通常会将时间缩短一小时(时间从前一天的00h00回到23h00)。如果你只是使用正午,它不应该发生(如果有类似的错误,时间将从12h00回到11h00,但是这一天不会改变)。

(当然你需要记住,当你传递它时,日期是中午,有时它可能不太好)

例如,看看我们在公司应用程序中使用的YUI库中的这个错误:

https://github.com/yui/yui2/pull/15

这只发生在Firefox中,仅在Windows上发生,仅在特定时区发生,仅在特定月份发生。但它确实发生了。