如何格式化日期字符串以便新的日期(字符串)在浏览器中返回一致的结果?

时间:2014-12-06 15:13:15

标签: javascript date cross-browser

如何格式化日期字符串以识别为绝对值,这意味着新的日期(字符串)应返回没有时区偏移的日期对象?

我总是知道JavaScript中的日期很有趣,但这是呃...太荒谬了? 我希望我错过了什么。

FIREFOX:

new Date("2015-01-01") -> Jan 1  - OK
new Date("1/1/2015") -> Dec 31  - THAT HURT!
new Date("2015-01-01T00:00:00Z") -> Jan 1  - OK
new Date("January 1, 2015") -> Dec 31 - THAT HURT!
new Date("January 1, 2015 00:00:00") -> Dec 31 - THAT HURT!
new Date(2015, 0, 1) -> Dec 31 - THAT HURT!
new Date(2015, 0, 1, 0, 0, 0) -> Dec 31  - THAT HURT!
new Date(2015, 0, 1, 1, 0, 0) -> Jan 1  - YOU'RE KIDDING ?
new Date("2015/01/01") -> Dec 31  - THAT HURT!

反转片

new Date("2015-01-01") -> Jan 1 - OK
new Date("1/1/2015") -> Jan 1 - OK
new Date("2015-01-01T00:00:00Z") -> Jan 1 - OK
new Date("January 1, 2015") -> Jan 1 - OK
new Date("January 1, 2015 00:00:00") -> Jan 1 - OK
new Date(2015, 0, 1) -> Jan 1 - OK
new Date(2015, 0, 1, 0, 0, 0) -> Jan 1 - OK
new Date(2015, 0, 1, 1, 0, 0) -> Jan 1 - OK
new Date("2015/01/01") -> Jan 1 - OK

IE

new Date("2015-01-01") -> NaN   - THAT HURT!
new Date("1/1/2015") -> Jan 1 - OK
new Date("2015-01-01T00:00:00Z")-> NaN   - THAT HURT!
new Date("January 1, 2015") -> Jan 1  -  OK
new Date(2015, 0, 1) -> Jan 1 - OK
new Date(2015, 0, 1, 0, 0, 0) -> Jan 1  - OK
new Date(2015, 0, 1, 1, 0, 0) -> Jan 1 - OK
new Date("2015/01/01") -> Jan 1 - OK

据我所知,在某些情况下,Firefox正在补偿时区偏移,我知道IE很糟糕。但是如何在浏览器中获得一致的新日期(无论如何)?

如果有人可以解释这种行为,那么作为一个额外的好处,我将不那么沮丧,因为它变成了我的主要问题。

谢谢!

编辑:清理输出以使不一致的行为更清晰。 编辑:添加建议的字符串格式“2015/01/01” - 在FF中不起作用(在我的时区: - /)

2 个答案:

答案 0 :(得分:1)

这种行为已经存在了很长一段时间的问题,似乎没有人明确答复为什么开发人员选择了这些类型的选项。一些“经验法则”要遵循:

  • 尽可能坚持使用日期字符串“YYYY / MM / DD”。它得到普遍支持和明确无误。使用此格式,所有时间都是本地的。
  • 除非您知道自己在做什么,否则请避免使用带连字符的日期(“YYYY-MM-DD”)。只有较新的浏览器才支持它们。
  • 只要您指定四位数年份,日期字符串至少在所有浏览器中都有唯一的解析。某些浏览器可能会返回错误,但您不会出现不一致的行为。
  • Chrome往往比其他浏览器更受欢迎。如果日期格式在Chrome中解析,则不应假设它在其他任何位置进行解析。

除了插件之外,我可以推荐的最佳建议是将Date函数的输入字符串格式化为您知道在浏览器中保持一致的内容。你已经完成了研究,所以这应该很简单。一旦你习惯了这一段时间,它将成为第二天性。

我确实发现了这一段时间。我喜欢这个功能,因为它给了我“允许UTC”的“选择”: HERE

还有 DateJS

答案 1 :(得分:-1)

我对日期的跨浏览器兼容性的选项是Date.parse(<<My Date String>>)这将返回以毫秒为单位的日期时间,然后您可以以任何您想要的方式格式化它。

我只在IE8和Chrome中试过这个。