【问题标题】:Stange javascript Date behaviour on particular dates [duplicate]Stange javascript日期行为在特定日期[重复]
【发布时间】:2017-09-01 09:33:10
【问题描述】:

我注意到 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++;
                    };

数组是我所质疑的 API。

这里的问题是当我的代码尝试这个时

array[i].end_date = new Date (array[i].end_date);

在这个日期

"31-12-2017 23:59:59"

array[i].end_date 变为 Invalid Date

这是怎么发生的?

编辑:

var date = "31-12-2017 23:59:59"
var dateSplitted = date.split("-");
var dateInverted = dateSplitted[1] +"-" +dateSplitted[0] +"-"+dateSplitted[2];
dateSplitted = dateInverted.split(" ");
alert(dateSplitted[0]+"T"+dateSplitted[1]+"Z");
alert(new Date(dateSplitted[0]+"T"+dateSplitted[1]+"Z"));

我实现了这个粗略的方法来解析我的日期,但我不明白这是怎么回事 有什么帮助吗?

【问题讨论】:

  • 不是这个特定的日期。这种格式的任何日期都是无效的。它还说25-08-2015 18:30:10 是无效日期。

标签: javascript angularjs date


【解决方案1】:

该日期不是 Date 对象需要解析的任何格式,也不是通常支持的格式,即使它不是必需的。

only 格式 Date 需要解析是 ISO-8601 子集 defined by the specification。那个格式的日期是"2017-12-31T23:59:59"

由于历史原因,xx-xx-xxxx 通常被视为美国格式的日期(即使在非美国语言环境中),即MM-DD-YYYY,而不是美国以外常见的更合理格式。的DD-MM-YYYY。但即使这样也不是普遍的,也没有具体说明。唯一没有指定但的格式,据我所知,通用是DD/MM/YYYY(还是美国格式)。

【讨论】:

  • 感谢答案,那么如何正确解析该 API 给出的其他日期?我应该考虑“运气”属性吗?
  • 也许也值得在日期上添加指向 MDN 的链接?规格可能有点难以阅读:) developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
  • @Anon:好吧,如果它是(比如)01-12-2017,它将在 2017 年 1 月 12 日(而不是 2017 年 12 月 1 日)的许多(但不是全部!)实现上被解析。但由于第一个数字是 31,这不是一个有效的月份,31-12-2017 根本不会解析。
  • 那么我如何“强制”js Date 以 dd-MM-yyyy 格式解析?上面代码中的过滤器够不够用?
  • @Anon:你必须自己编写代码来解析它,并使用Date构造函数的多参数形式。这里有很多关于如何做到这一点的问题和答案。编辑:大声笑,@ 987654323@我应该把它作为一个副本关闭(回想起来,这很明显,但我陷入了“它只是某些日期”然后......)
【解决方案2】:

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

您的日期格式应为12-31-2017 23:59:59 而不是31-12-2017 23:59:59。喜欢mm/dd/yyyy。可能它就像您的浏览器默认日期格式一样工作。

您可以查看以下警报结果。

alert(new Date("12-31-2017 23:59:59"))// this is a correct format.

alert(new Date("31-12-2017 23:59:59"))// here `31` is month. The default month count is 12. but here it's automatically add 19 months into 12 month(31-12). So it will go to future year.

alert(new Date("13-12-2017 23:59:59"))// here you can check the result of Jan month 2018 

编辑:

您应该在转换之前交换月份和日期。试试下面的代码

 

var date= "31-12-2017 23:59:59".split("-");

var newDate = date[1] +"-" +date[0] +"-" +date[2];

alert(new Date(newDate));

【讨论】:

  • 好的,有问题,但是有办法可以将上面的字符串解析为日期格式吗?
  • 我已经编辑了我的答案。 @Anon 如果您有任何澄清,请告诉我。
  • 这是一个非常棘手的方法,仍然适合我的情况
  • @Anon 如果您得到了答案,请不要忘记将此标记为答案。谢谢
  • @RameshRajendran & T.J.克劳德,我必须感谢你们俩的帮助,我会用你们的帮助解析我的日期
猜你喜欢
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2018-04-15
相关资源
最近更新 更多