在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
答案 0 :(得分:15)
我看过你的代码,起初我没有得到相同的结果。然而,当我将时区改为巴西(格林威治标准时间03:00) - 圣保罗时,我得到了相同的结果。这显然是一个错误,现在已被追溯到V8并报告。
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
有关详情,请参阅以下链接
答案 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上发生,仅在特定时区发生,仅在特定月份发生。但它确实发生了。