javascript - 为什么 moment.js 只为某些日期生成无效日期?

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

最佳答案

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?";
}

关于javascript - 为什么 moment.js 只为某些日期生成无效日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37735736/

相关文章:

php - ajax返回null

javascript - 需要从 API 获取 Name、Node Name 和 Phase Values

javascript - 对类选择的元素数组使用 FOR 循环,并在每个元素上调用函数

javascript - 如何在本地时刻实例上使用 duration()?

javascript - 将 Date 转换为 Epoch 秒时从 moment-timezone 获取不正确的值

Azure Bot 中的 JavaScript 变量分配

javascript - 确定 Iframe 是否处于安全来源以允许 "Powerful Features"

javascript - moment 将日期分成 30 分钟间隔

javascript - 2038年之后的momentjs夏令时

javascript - 两个日期之间的差异(以小时和分钟为单位)