Javascript 为什么moment.js只为某些日期生成无效日期?
这个函数有点奇怪,我不知道是什么引起的。用户可以从下拉列表中选择天数。 日期是:Javascript 为什么moment.js只为某些日期生成无效日期?,javascript,momentjs,Javascript,Momentjs,这个函数有点奇怪,我不知道是什么引起的。用户可以从下拉列表中选择天数。 日期是:[3,7,14,21,28,30,60,90,180,365] 因此,当用户选择3时,moment.js会将其转换为适当的ISO日期。但是,如果用户选择7、14或21,则会生成“无效日期”,但对其他所有内容都有效。发生什么事了 vm.getSelectedDate = function (days) { console.log(days); if (vm.selecte
[3,7,14,21,28,30,60,90,180,365]
因此,当用户选择3
时,moment.js会将其转换为适当的ISO日期。但是,如果用户选择7、14或21,则会生成“无效日期”,但对其他所有内容都有效。发生什么事了
vm.getSelectedDate = function (days) {
console.log(days);
if (vm.selectedReminderDay) {
vm.selectedReminderDate = new Date(vm.today);
console.log(vm.selectedReminderDate);
vm.selectedReminderDate.setDate(vm.today.getDate() + days);
console.log(vm.selectedReminderDate);
var m = moment(vm.selectedReminderDate, "MM/DD/YYYY h:mm:ss A");
console.log(m);
vm.utcReminderDate = m.toISOString();
console.log(vm.utcReminderDate);
return "in " + vm.selectedReminderDay + " days";
}
else {
return "When?"
}
}
Date.getDate()
获取当月的当前日期,当该日期超出范围(通常超过30天)时,将导致意外beahvior。您可以使用的是Date.getTime()
:
乘法只是将天数转换为setTime
期望的毫秒
但是更好的方法是单独使用momentjs操纵日期,如下所示:
vm.getSelectedDate = function (days) {
if (vm.selectedReminderDay) {
var newdate = moment(vm.today).add(days, 'days');
vm.utcReminderDate = newdate.toISOString();
return "in " + vm.selectedReminderDay + " days";
}
else return "When?";
}
关于更好地利用动量的建议在其他答案中也是有效的 7、14和21似乎是唯一不正常的数字的实际原因是您试图用于解析的格式。Moment似乎将日期对象转换为字符串进行解析,月份的“MM”部分与转换字符串中的日期部分匹配。因此,如果一个月中的某一天不在1-12范围内,则该日期无效。如果你在另一天运行相同的代码,你会发现其他神奇的数字
我不太了解MM是如何与日期部分匹配的,在您的区域设置中它可能与我的不同,但我相信这是它的要点。您似乎没有在任何地方使用moment,但如果是,如果传递了date对象,您可以使用
addDays
而不是(即将中断)getDate+x
,矩将不使用格式字符串进行解析;这只是多余的。看,我拒绝相信它,并且更深入地研究了代码。实际上就是这样:在进行isDate检查之前考虑输入,导致输入在到达链接的函数之前被转换为字符串。(注意:这是我碰巧安装的一个稍旧的版本,从那以后没有看它是否有变化)我想知道为什么答案被否决,而上面错误的评论被否决……@MikeMcCaughan Donstipe是正确的,即使是2.13。如果传递了格式,则将日期解释为字符串。我正试图确定这是否是一个错误。在某种程度上,忽略是有意义的,但是如果您需要一个字符串,并且得到一个日期对象,那么它可能应该尝试解析一个字符串。我的错。你说得对。不幸的是,S.O.不会让我改变我的投票,直到有一些编辑。如果你能为这篇文章添加一个失败的例子,我将投你一票。谢谢
vm.getSelectedDate = function (days) {
if (vm.selectedReminderDay) {
var newdate = moment(vm.today).add(days, 'days');
vm.utcReminderDate = newdate.toISOString();
return "in " + vm.selectedReminderDay + " days";
}
else return "When?";
}