IE 11 - 日期无法正常使用

8
  1. new Date().toLocaleDateString('en-US'); // "‎8‎/‎17‎/‎2018"
  2. new Date("8/17/2018") //有效日期
  3. new Date(new Date().toLocaleDateString('en-US')) // 无效日期

我试图从本地日期字符串(请参见屏幕截图)创建date,但在仅IE11中无法工作。 虽然使用正常的date string可以正常工作。

我知道“”双引号有些问题,但无法让它正常工作。

有什么建议吗?

enter image description here


字符串应该是一个符合RFC2822或ISO 8601格式的日期。参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/parse - Wilfred Clement
同样的问题出现在momentjs中。 - Dipak Telangre
JavaScript 中的有效日期时间字符串是什么? - str
2个回答

2
似乎可以这样做。
new Date(new Date().toLocaleDateString('en-US').replace(/[^ -~]/g,''))

ie11的快照

参考答案


(说明:此处为HTML标签,无需翻译)

It worked - Dipak Telangre
@jackjop——你似乎不知道自己在看什么。toLocaleString 的输出是与实现相关的,浏览器不需要能够解析它,你也不应该期望它们能够解析。有许多字符串可以从 toLocaleString 生成,但没有任何浏览器可以解析它们,更不用说 IE 了。另一方面,toString 的输出现在已经标准化,当前的浏览器都需要解析它。 - RobG
@RobG new Date().toLocaleDateString('en-US')new Date().toLocaleDateString('en-US').replace(/[^ -~]/g,'') 在我试过的一些浏览器中(包括 IE11)会给出相同的输出结果。那么在这种情况下,replace(/[^ -~]/g,'')toString() 之间有什么区别呢?我不太理解。我找不到任何关于这个问题的资源。 - sertsedat
3
@jackjop——毫无根据地诋毁产品不是一个好主意。关键在于toLocaleDateString的结果取决于实现,浏览器不一定能够解析它。仅仅因为某些随机代码产生了预期的结果,却无法知道其如何或为什么工作,这并不是建议采用它的合适依据。:( - RobG
@RobG,我明白了。所以我们只需要接受它并找到解决方法。谢谢您的解释! - sertsedat

1

只需使用 momentjs

moment("8/17/2018", "L").format() 将输出:
"2018-08-17T00:00:00+02:00"

+02:00 是我的本地时区。您也可以指定使用协调世界时或其他时区。)

还要注意,L 取决于您安装的时区配置文件。这是默认的 en 一个。

您还可以将 "L" 替换为 "MM/DD/YYYY"

moment 的第二个参数始终指定输入的格式。
它也能猜测输入,但您需要进行实验。

.format("L") 本质上是相同的,但在输出方向上不同。


1
"Use library X" 的回答并不有帮助。问题是为什么内置解析器无法正确解析 toLocaleDateString 的输出(这是依赖于实现的,即使是相同的语言标记也可能不同)。 - RobG
我同意避免使用“x库”的回答,但就日期而言,我持不同意见。是的,你可以让东西工作,但如果你依赖自动解析而不是正确使用Date,你永远无法百分之百确定你的代码将在所有浏览器中运行。我向人们推荐momentjs,因为它消除了这种通常会失败的依赖关系。 - GottZ
智能电视X将如何运行您的代码?它将如何在PlayStation Vita上运行?旧手机上的三星浏览器呢?Opera Mini呢?Opera Mobile呢? - GottZ
要使用任何解析器,您需要知道格式,以便告诉解析器它是什么。 OP的问题在于toLocaleDateString的输出取决于实现,因此他们不知道格式,因此即使使用需要解析格式(如moment.js)的解析器,也无法告诉解析器。重要的是要告诉OP为什么会出现问题以及如何在没有库的情况下解决它(因为没有库标签或提到)。您可以包括使用库的解决方案,但您的答案不应仅使用未在OP中标记或提到的库。 - RobG
PS. 解析格式为 MM/DD/YYYY 的日期只需要两行代码,这将在任何符合 ed 1 或更高版本的 ECMAScript 实现中运行,即任何商业实现中都可以使用。 :-) - RobG
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接