特定日期上的Stange javascript日期行为

特定日期上的Stange javascript日期行为,javascript,angularjs,date,Javascript,Angularjs,Date,我注意到javascript在管理这个特定日期时有一种奇怪的行为 "31-12-2017 23:59:59" 我有一个API,我调用它并将一些日期作为字符串返回给我,我必须使用js将它们转换为日期 我的代码是这样的 while (i<array.length){ array[i].start_date = new Date (array[i].start_date);

我注意到javascript在管理这个特定日期时有一种奇怪的行为

"31-12-2017 23:59:59"
我有一个API,我调用它并将一些日期作为字符串返回给我,我必须使用js将它们转换为日期

我的代码是这样的

while (i<array.length){
                                array[i].start_date = new Date (array[i].start_date);
                                array[i].start_date.setHours(array[i].start_date.getHours()+1);
                                array[i].start_date = $filter('date')(array[i].start_date, "dd-MM-yyyy HH:mm:ss");

                                array[i].end_date = new Date (array[i].end_date);
                                array[i].end_date.setHours(array[i].end_date.getHours()+1);
                                array[i].end_date = $filter('date')(array[i].end_date, "dd-MM-yyyy HH:mm:ss");  
                                $scope.insSupplies.push(array[i]);

                        i++;
                    };
这天

"31-12-2017 23:59:59"
数组[i]。结束日期
变为
无效日期

这是怎么发生的

编辑:

var date=“31-12-2017 23:59:59”
var dateSplitted=date.split(“-”);
var dateinversated=dateSplitted[1]+“-”+dateSplitted[0]+“-”+dateSplitted[2];
DateSplited=DateInversed.split(“”);
警报(dateSplitted[0]+“T”+dateSplitted[1]+“Z”);

警报(新日期(dateSplitted[0]+“T”+dateSplitted[1]+“Z”)
该日期不是
date
对象需要解析的任何格式,也不是通常支持的格式,即使它不是必需的

解析ISO-8601子集时只需要格式
日期
。按照这种格式,该日期将是2017-12-31T23:59:59


出于历史原因,
xx-xx-xxxx
通常被视为美国格式的日期(即使在非美国地区也是如此),即
MM-DD-YYYY
,而不是美国以外常见的更合理的格式
DD-MM-YYYY
。但即使这样也不是通用的,而且也没有具体说明。唯一没有指定但据我所知是通用的格式是
DD/MM/YYYY
(同样是美国格式)。

我不知道这里发生了什么问题。但解决方案是,您的月份和日期格式被错误地放置在转换位置

您的日期格式应为
12-31-2017 23:59:59
,而不是
31-12-2017 23:59:59
。如
mm/dd/yyyy
。可能它的工作原理与浏览器的默认日期格式类似

您可以在下面查看警报结果

alert(新日期(“12-31-2017 23:59:59”)//格式正确。
警报(新日期(“31-12-2017 23:59:59”)//这里的'31'是月份。默认月份计数为12。但在这里,它会自动将19个月添加到12个月(31-12)。因此,它将在未来的一年。

警报(新日期(“13-12-2017 23:59:59”)//您可以在这里查看2018年1月的结果
不是这个特定日期。此格式的任何日期都无效。它还说,
25-08-2015 18:30:10
是一个无效的日期。答案是thx,那么该API给出的其他日期怎么可能被正确解析?我应该考虑“运气”属性吗?也许值得在日期上添加MDN链接?规范可能有点难读:)@Anon:好吧,如果它是(比如)2017年12月01日
,那么它将在2017年1月12日(而不是2017年12月1日)的许多(但不是所有!)实现中被解析。但是由于第一个数字是31,这不是一个有效的月份,
31-12-2017
根本不解析。那么我如何“强制”js Date以dd-MM-yyyy格式解析呢?以上代码中我的过滤器是否足够?@Anon:您必须自己编写代码来解析它,并使用
Date
构造函数的多参数形式。关于如何做到这一点,这里有几十个问题和答案。编辑:哈哈,我应该把它作为一个副本关闭(回想起来,这很明显,但我陷入了“这只是特定的日期”,然后…)好的,有问题,但有一种方法我可以将上面的字符串解析为日期格式?我已经编辑了我的答案@如果您有任何澄清,请不要告诉我。这是一个非常棘手的方法,仍然适合我的要求case@Anon如果你得到了答案,那么别忘了把它标记为答案。thanks@RameshRajendran&T.J.Crowder我必须感谢你们两位的帮助,我会用你们的帮助解析我的约会
"31-12-2017 23:59:59"