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

IT技术 javascript jquery
2021-01-26 02:42:04

我的代码在谷歌浏览器中正常工作,但在 Safari 中无法正常工作。

我发现我需要转换yyyy-MM-dd HH:mm:ssISO 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">
3个回答

为了让您的问题更容易,您的问题在于:

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

这项工作在 chrome 中没问题,但在 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: parsing from string此外,使用momentjs,您的整个示例更容易:

var minutes = moment().diff("2014-02-18 15:00:48", 'minutes');
时刻是伟大的,但它也是巨大的。单独的时刻几乎比我的整个应用程序大 2 倍
2021-03-23 02:42:04
它确实是非常方便的实用程序。我无法想象在没有片刻的情况下在 javascript 中使用日期。
2021-03-28 02:42:04

我认为何塞在这里错过了一点 - 不要忘记包括 Z 否则时区会滞后。

新日期('2014-02-18T15:00:48') 新日期('2014-02-18T15:00:48Z')

您可以使用 new Date('2014-02-18T15:00:48'.replace(/\s/, 'T')+'Z').

请参阅此了解更多信息 - new Date() 在 Chrome 和 Firefox 中的工作方式不同

在 iOS 中注意到了这个问题,并最终在这里寻找解决方案。非常适合我的需要(在 PHP 中处理 MySQL 日期时间值的字符串替换)。由于@AbhishekJain 没有代表发表评论,因此支持此答案,并且也支持 José 的回答;)
2021-03-23 02:42:04
请评论何塞的答案,而不是新的答案。
2021-04-02 02:42:04
除非这是我自己的答案,否则我无法发表评论。说 - “你必须有 50 个声望才能发表评论”:(
2021-04-13 02:42:04

我以前见过这样的问题,对我有用的是将日期和时间之间的空格替换为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在这里