【问题标题】:UTC date in Date() object outputs differently in SafariDate() 对象中的 UTC 日期在 Safari 中的输出不同
【发布时间】:2018-05-24 17:34:30
【问题描述】:
var dateString = "2018-01-01T00:00:00";
new Date(dateString);

Chrome、Edge 和 Firefox(右):

Mon Jan 01 2018 00:00:00 GMT-0800 (PST)

Safari(错误):

Sun Dec 31 2017 16:00:00 GMT-0800 (PST)

我该怎么做才能让 Safari 遵守 1 月 1 日的规定?我不想使用moment.js 或其他框架来解决这个问题。如果您是 JavaScript Date() 对象大师,请指出正确的方向。

谢谢。

【问题讨论】:

  • Safari 的解析器有问题(可能还有其他问题),所以自己解析(3 行代码)。
  • 我的回答是否完全回答了您的问题?

标签: javascript date datetime safari utc


【解决方案1】:

某些浏览器处理日期字符串的方式不同。 Mozilla 在他们的 Date 文档页面上指出了这个问题:

由于浏览器的差异和不一致,强烈建议不要使用 Date 构造函数(和 Date.parse,它们是等效的)解析日期字符串。 - Source

他们还在他们的 Date.parse() 文档页面上注明了这一点,该页面提供了解决方案的提示:

在 ES5 之前不建议使用 Date.parse,字符串的解析完全依赖于实现。不同主机解析日期字符串的方式仍有很多差异,因此应该手动解析日期字符串(如果要适应许多不同的格式,库可以提供帮助)。 - Source

this answer 中所述,您最好拆分字符串并使用分隔的Date() 构造函数。示例代码:

var arr = "2018-01-01T00:00:00".split(/\D/);
var date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);

在一个函数中:

function parseDateString(dateString) {
    var arr = dateString.split(/\D/);
    return new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
}

我希望这能回答你的问题。

【讨论】:

  • 更新了答案以包含更多文档。
  • 使用"...".split(/\D/)会简单一些。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多