Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么moment.js只为某些日期生成无效日期?_Javascript_Momentjs - Fatal编程技术网

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