Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Moment.js问题使用夏令时添加天数_Javascript_Date_Momentjs - Fatal编程技术网

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

Javascript Moment.js问题使用夏令时添加天数,javascript,date,momentjs,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" 我又得到了什么

在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

根据这个JSFIDLE,您正在做/应该/正在做的事情。你在测试什么浏览器


我看过你的代码,一开始我没有得到同样的结果。然而,当我把时区改为巴西时(GMT-03:00),我得到了同样的结果。这显然是一个bug,现已追踪到V8并报告

2014年10月18日星期六00:00:00 GMT-0300脚本。js:4

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

我提交了一个bug:

更新

Moment.js对此错误不负责。它被追踪到V8(Chrome和Node都使用的javascript引擎)中的一个bug。我已经提交了一个V8的bug,您可以在这里查看:

这是艾萨克·坎布伦为追踪它所做的工作

好的,现在在Ubuntu和OSX中复制(我以前在测试中使用的是另一个巴西城市)。我使用的是Node,不是Chrome,但出于我们的目的,V8就是V8

moment([2014, 9, 18]).add(1, 'd').format(); //=> '2014-10-18T00:00:00-03:00'
问题在于,矩基本上是这样做的:

var d = new Date(2014, 9, 18);
d.setDate(19);
d.toString(); // => Sat Oct 18 2014 23:00:00 GMT-0300 (BRT)
//wtf?
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)
然后将小时数设置为零。由于V8奇怪地将时间设置为10月18日晚,即使我们特别要求它将时间设置为10月19日,答案是错误的。这一切都特别奇怪,因为这里的DST转换是向前跳的,这意味着如果有任何事情,它应该在1:00结束,而不是前一天的23:00

事实上,它甚至做到了这一点:

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

只需使用以下代码即可在
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
有关更多详细信息,请查看下面的链接


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

    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);

避免此类问题的一般注意事项(如您所见,它们确实会发生,而且有时会由于浏览器错误而发生):如果您使用
Date
对象表示一天,您只需约定中午(12h00)而不是午夜(00h00)到达
Date
构造函数,然后在准备显示日期的功能中,将其切断

浏览器中的错误和DST导致的问题通常会将时间移动一个小时(时间从前一天的00点回到23点)。如果您只使用中午,则不会发生这种情况(例如,在出现类似错误的情况下,时间将从12点回到11点,但当天不会改变)

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

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


这只发生在Firefox、Windows、特定时区和特定月份。但它确实发生了。

你应该先传递数字,然后传递“天”


在Chrome版本50.0.2661.37 beta-m(64位)中进行测试

您能提供更多详细信息吗?我没有看到这种行为。这里有一个例子:我添加了Chrome版本,在那里我更新了我的答案,包括艾萨克·坎布伦所做的工作和一份到V8的bug报告,供您跟踪。很好的回答。在Chrome 32.0.1700.76 m的2次测试中,我得到了“2014年10月18日星期六00:00:00 GMT-0300”@NathanielJohnson:(插入了.add()的叉子…@earnaz:你正在使用最新版本的矩量.js吗?我不确定是什么原因导致了这个问题。@mori57是的。MomentJs版本:2.5.1对奇怪的plunkr感到担忧。我可能把“冻结”功能搞砸了。感谢@mori57修复。如果他们能给你回复的话,我会对来自moment.js团队的答案非常感兴趣!这还是一个BUG吗?有什么解决办法吗?我试着用setDate代替,但它也不起作用。这个问题已经解决了。在将系统时间更改为圣保罗后,我检查了plunker,它检查出(包括正确的DST调整)没有。问题是V8中有一个bug。现在已经修好了。
var m = moment(new Date(2014, 9, 18, 0, 0, 0));
console.log(m.toString());
console.log(m.add(1, "days").toString());