这个功能奇怪,我无法弄清楚是什么造成的。用户可以从下拉列表中选择天数。
日期是:[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?"
}
}
答案 0 :(得分:2)
Date.getDate()
获取当月的当天,当超出范围时(通常超过~30时)会导致意外的行为。您可以使用的是Date.getTime()
:
vm.selectedReminderDate.setTime(vm.today.getTime() + (days*24*60*60*1000));
乘法只是将天数转换为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?";
}
答案 1 :(得分:0)
更好地使用momentjs的建议在其他答案中有效。
7,14和21似乎是唯一行为不正确的数字的实际原因是您尝试用于解析的格式。 Moment似乎将你的Date对象变成了一个字符串,用于解析和" MM"几个月的部分匹配转换后的字符串中的日期部分。因此,月份日期不在1-12范围内的任何日期都不起作用。如果你在另一天运行相同的代码,你会发现其他神奇的数字。
我不太了解MM如何与日期部分匹配,而且您的语言环境可能与我的不同,但我相信它是其中的主旨。