我使用下面的函数prettyDate()
将时间戳转换为更友好的格式。我不需要一个自动将div中的值转换为" Time ago"格式。
API会返回时间戳1400564166115
和1400695785000
。 date.now()
提供1400696094406
。
使用下面的代码,第一个时间戳1400564166115
转换为2014-05-20T05:36:06.115Z
,其中函数prettyDate()
将其转换为Yesterday
。
对于第二个时间戳,1400695785000
转换为2014-05-21T18:09:45.000Z
,但prettyDate()
将其转换为undefined
。此外,在这种情况下,day_diff
为-1
。 diff
为-14347.209
,并逐渐向0移动。
为什么提供undefined
,day_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
答案 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()
。