野生动物园中的日期无效

2022-08-30 00:35:24
 alert(new Date('2010-11-29'));

chrome,ff对此没有问题,但Safari会喊“无效日期”。为什么?

编辑:好的,根据下面的评论,我使用了字符串解析并尝试了这个:

alert(new Date('11-29-2010')); //doesn't work in safari
alert(new Date('29-11-2010')); //doesn't work in safari
alert(new Date('2010-29-11')); //doesn't work in safari

编辑 Mar 22 2018 : 似乎人们仍然在这里登陆 - 今天,我会使用或完成它。Date-fns也非常无痛和轻便。momentdate-fns


答案 1

对我来说,仅仅因为Safari无法正确完成它而实现一个新的库是太多了,正则表达式是过度的。下面是一个衬里

console.log (new Date('2011-04-12'.replace(/-/g, "/")));

答案 2

该模式不是构造函数的官方支持格式。Firefox似乎支持它,但不要指望其他浏览器也这样做。yyyy-MM-ddDate

以下是一些受支持的字符串:

  • 月-日-年
  • yyyy/mm/dd
  • 月/日/年
  • 嗯嗯嗯
  • 嗯嗯嗯

DateJS似乎是一个很好的库,用于解析非标准日期格式。

编辑:刚刚检查了ECMA-262标准。引用第15.9.1.15节:

日期时间字符串格式

ECMAScript 根据 ISO 8601 扩展格式的简化,为日期时间定义了字符串交换格式。格式如下: YYYY-MM-DDTHH:mm:ss.sssZ 其中的字段如下所示:

  • YYYY 是公历中年份的十进制数字。
  • “-”(虹吸音)在字符串中字面上出现两次。
  • MM是一年中从01(1月)到12(12月)的月份。
  • DD 是一个月中从 01 到 31 的日期。
  • “T”按字面意思出现在字符串中,以指示 time 元素的开头。
  • HH 是自午夜以来以两位小数位表示的完整小时数。
  • “:”(冒号)在字符串中字面上出现两次。
  • mm 是自小时开始以来以两位小数位表示的完整分钟数。
  • ss 是自分钟开始以来的完整秒数,以两位小数位表示。
  • "."(点)按字面意思出现在字符串中。
  • sss 是自秒开始以来的完整毫秒数,为三位小数。“.”和毫秒字段都可以省略。
  • Z 是指定为“Z”(表示 UTC)或“+”或“-”后跟时间表达式 hh:mm 的时区偏移量

此格式包括仅日期表单:

  • 年-毫米
  • 年-月-日

它还包括附加了可选时区偏移量的纯时间表单:

  • 高度:毫米
  • THH:mm:ss
  • THH:mm:ss.sss

还包括“日期时间”,可以是上述内容的任意组合。

因此,似乎YYYY-MM-DD包含在标准中,但由于某种原因,Safari不支持它。

更新:在查看了datejs文档并使用它之后,您的问题应该使用如下代码来解决:

var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy");
var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy");
var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd");
var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM");