时间在Javascript中未定义

时间:2014-05-21 18:19:19

标签: javascript jquery node.js datetime time

我使用下面的函数prettyDate()将时间戳转换为更友好的格式。我不需要一个自动将div中的值转换为" Time ago"格式。

API会返回时间戳14005641661151400695785000date.now()提供1400696094406

使用下面的代码,第一个时间戳1400564166115转换为2014-05-20T05:36:06.115Z,其中函数prettyDate()将其转换为Yesterday

对于第二个时间戳,1400695785000转换为2014-05-21T18:09:45.000Z,但prettyDate()将其转换为undefined。此外,在这种情况下,day_diff-1diff-14347.209,并逐渐向0移动。

为什么提供undefinedday_diff导致<0的原因是什么?

JSfiddle: http://jsfiddle.net/pWNrS/

示例

var d = new Date(parseInt(1400564166115)).toISOString()
prettyDate(d)    // Yesterday

var e = new Date(parseInt(1400695785000)).toISOString()
prettyDate(e)    // undefined *****WHY?*****

prettyDate()

prettyDate = function(time){
    var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ")),
        diff = (((new Date()).getTime() - date.getTime()) / 1000),
        day_diff = Math.floor(diff / 86400);

    if ( isNaN(day_diff) || day_diff < 0 || day_diff >= 31 )
        return;

    return day_diff == 0 && (
            diff < 60 && "just now" ||
            diff < 120 && "1 minute ago" ||
            diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
            diff < 7200 && "1 hour ago" ||
            diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
        day_diff == 1 && "Yesterday" ||
        day_diff < 7 && day_diff + " days ago" ||
        day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago";
}

// If jQuery is included in the page, adds a jQuery plugin to handle it as well
if ( typeof jQuery != "undefined" )
    jQuery.fn.prettyDate = function(){
        return this.each(function(){
            var date = prettyDate(this.title);
            if ( date )
                jQuery(this).text( date );
        });
    };

单步执行prettyDate()

日期:Wed May 21 2014 18:35:46 GMT-0400 (EDT)

(new Date())。getTime():1400697389253

date.getTime():1400711746000

diff:-14356.757

day_diff:-1

1 个答案:

答案 0 :(得分:2)

问题与丢失时区信息有关。

当你改变ISO字符串时,你正在改变关于被解析的日期/时间的假设。在ISO格式中,“Z”表示给定的时间是UTC。但是,一旦将其剥离,日期解析器就不再有任何关于使用时区的线索,因此它使用本地时区并相应地调整时间。这是导致diff为负值的原因(因为您的本地时区偏移)。

快速解决方法是将“GMT”附加到日期/时间字符串的末尾,然后再将其传递给new Date()new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ") + ' GMT')。假设传入的所有日期都是UTC / GMT。但是,如果浏览器支持ES5(例如,您可以测试var supportsISO8601 = Date.prototype.toISOString === 'function';,则可以将其保留为ISO8601格式并将字符串直接传递给new Date()