为什么moment.js仅在某些日期生成无效日期?

时间:2016-06-09 20:39:25

标签: 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.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?"
            }
        }

2 个答案:

答案 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如何与日期部分匹配,而且您的语言环境可能与我的不同,但我相信它是其中的主旨。