Safari JavaScript Date() NaN问题(yyyy-MM-dd HH:mm:ss)

37

我的代码在Google Chrome中运行正常,但在Safari中不行。

我发现需要将yyyy-MM-dd HH:mm:ss转换为ISO 8601格式,但我没有找到解决方法。


在线测试链接:http://jsfiddle.net/UVgHR/


Javascript:

$(document).ready(function() {

    calculateMinutes();
    setInterval(calculateMinutes, 60000);

});

function calculateMinutes() {
    $('.calculateMinutes').each(function () {
        var diff = Math.abs(new Date( $(this).data('timestamp') ) - new Date());
        var minutes = Math.floor((diff/1000)/60);
        $(this).html( minutes + ' min.' );
    });
}

HTML示例:

<span class="calculateMinutes" data-timestamp="2014-02-18 15:00:48">
6个回答

100
为了让您的问题更加简单,您的问题涉及以下内容:
new Date('2014-02-18 15:00:48')

这段代码在谷歌浏览器中可以正常工作,但在Safari浏览器中无法正常工作。MDN关于ECMAScript 5 ISO-8601格式支持的说明如下:

或者,日期/时间字符串可以采用ISO 8601格式。例如,"2011-10-10"(仅日期)或"2011-10-10T14:48:00"(日期和时间)都可以被传递和解析。

如果包含T则可以正常工作:
new Date('2014-02-18T15:00:48')

你可以使用new Date('2014-02-18T15:00:48'.replace(/\s/, 'T'))
如果你处理了很多这样的情况,我建议使用moment,它似乎可以很好地处理带有或不带有T的情况:从字符串解析。此外,整个示例使用momentjs更容易:
var minutes = moment().diff("2014-02-18 15:00:48", 'minutes');

2
这确实是一个非常方便的工具。我无法想象在JavaScript中处理日期而没有Moment库。 - José F. Romaniello
2
moment很棒,但它也是非常庞大的。单独moment的大小几乎是我的整个应用程序的两倍。 - Charlie Martin

13
我认为Jose在这里忽略了一个要点 - 不要忘记包含Z,否则会有时区延迟。
new Date('2014-02-18T15:00:48') new Date('2014-02-18T15:00:48Z')
你可以使用new Date('2014-02-18T15:00:48'.replace(/\s/, 'T')+'Z')
更多信息请参见 - Chrome和Firefox中的new Date()行为不同

请在Jose的回答上进行评论,而不是新的回答。 - vinS
10
除非是我的答案,否则我无法发表评论。 提示 - “您必须拥有50点声望才能发表评论。” - Abhishek Jain
在iOS中注意到了这个问题,最终在这里寻找解决方案。对我的需求很有效(在MySQL datetime值上处理PHP字符串替换)。点赞这个答案,因为@AbhishekJain没有评论的声望,并且也点赞José的答案;) - Mavelo
此解决方案在日期中添加了5个小时。这是错误的实现。 - Ali Wahab

5

我曾经遇到过类似的问题,解决方法是将日期和时间之间的空格替换为 T。请尝试以下代码:

更新后的 JavaScript:

function calculateMinutes() {
    $('.calculateMinutes').each(function () {
        var timestamp = $(this).data('timestamp').replace(' ', 'T');
        var diff = Math.abs(new Date(timestamp) - new Date());
        var minutes = Math.floor((diff / 1000) / 60);
        $(this).html(minutes + ' min.');
    });
}

这里是JSFiddle示例网站


1

修改这段代码

new Date('2014-02-18 15:00:48')

To

new Date('2014-02-18 15:00:48'.replace(" ", "T"))

0

只是将“-”替换为“/”可能会起作用。

至于

var myTime = new Date('03/09/2022 00:00:00');

0

如果你用斜杠代替破折号,它就可以在Safari中工作:

dateTimeString.replace(/-/g, '/')


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