很久以前未在Javascript中定义

很久以前未在Javascript中定义,javascript,jquery,node.js,datetime,time,Javascript,Jquery,Node.js,Datetime,Time,我正在使用下面的函数prettyDate()将时间戳转换为更友好的格式。我不需要一个插件,可以自动将div中的值转换为“Time ago”格式 API返回时间戳140056416115和1400695785000date.now()给出1400696094406 使用下面的代码,第一个时间戳140056416115被转换为2014-05-20T05:36:06.115Z,其中函数prettyDate()将其转换为昨天 对于第二个时间戳,1400695785000转换为2014-05-21T18:

我正在使用下面的函数
prettyDate()
将时间戳转换为更友好的格式。我不需要一个插件,可以自动将div中的值转换为“Time ago”格式

API返回时间戳
140056416115
1400695785000
date.now()
给出
1400696094406

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

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

为什么它给出了未定义的
,是什么导致
日差
=31)
返回;
返回日_diff==0&&(
差值<60&“刚刚”||
差值<120&“1分钟前”||
差异<3600和数学楼层(差异/60)+“分钟前”||
差值<7200&“1小时前”||
差异<86400和数学楼层(差异/3600)+“小时前”)||
day_diff==1&“昨天”||
日差<7日和日差+“日前”||
日差<31&&Math.ceil(日差/7)+“周前”;
}
//如果jQuery包含在页面中,那么也会添加一个jQuery插件来处理它
if(jQuery的类型!=“未定义”)
jQuery.fn.prettyDate=函数(){
返回此值。每个(函数(){
var日期=prettyDate(本标题);
若有(日期)
jQuery(this).text(日期);
});
};

单步执行prettyDate()

日期:2014年5月21日星期三18:35:46 GMT-0400(美国东部时间)

(新日期()).getTime():
140069738953

date.getTime():
1400711746000

差异:
-14356.757


日期差异:
-1
问题与时区信息丢失有关

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


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

它是否符合您的'if'(isNaN???@Pogrindis是的,
day_diff
正在返回
-1
,但我不明白为什么…看到这么多人会很酷this@geedubb这是:第二个在Chrome中为我返回“1小时前”:
var d = new Date(parseInt(1400564166115)).toISOString()
prettyDate(d)    // Yesterday

var e = new Date(parseInt(1400695785000)).toISOString()
prettyDate(e)    // undefined *****WHY?*****
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 );
        });
    };