假设我在JavaScript中有两个字符串:
var date1 = '2008-10-03T20:24Z'
var date2 = '2008-10-04T12:24Z'
我怎么会得到这样的结果:
'4 weeks ago'
要么
'in about 15 minutes'
(应该支持过去和未来).
过去的差异有解决方案,但我还没有找到一个支持未来时间差异的解决方案.
这些是我尝试的解决方案:
John Resig’s Pretty Date和Zach Leatherman’s modification
jQuery解决方案的奖励积分.
最佳答案
看看你链接的解决方案……它实际上就像我轻浮的评论一样简单!
这是Zach Leatherman代码的一个版本,它代表您在未来的日期“In”.如您所见,这些变化非常小.
function humane_date(date_str){
var time_formats = [
[60,'Just Now'],[90,'1 Minute'],// 60*1.5
[3600,'Minutes',60],// 60*60,60
[5400,'1 Hour'],// 60*60*1.5
[86400,'Hours',3600],// 60*60*24,60*60
[129600,'1 Day'],// 60*60*24*1.5
[604800,'Days',86400],// 60*60*24*7,60*60*24
[907200,'1 Week'],// 60*60*24*7*1.5
[2628000,'Weeks',604800],// 60*60*24*(365/12),60*60*24*7
[3942000,'1 Month'],// 60*60*24*(365/12)*1.5
[31536000,'Months',2628000],// 60*60*24*365,60*60*24*(365/12)
[47304000,'1 Year'],// 60*60*24*365*1.5
[3153600000,'Years',31536000],// 60*60*24*365*100,60*60*24*365
[4730400000,'1 Century'],// 60*60*24*365*100*1.5
];
var time = ('' + date_str).replace(/-/g,"/").replace(/[TZ]/g," "),dt = new Date,seconds = ((dt - new Date(time) + (dt.getTimezoneOffset() * 60000)) / 1000),token = ' Ago',prepend = '',i = 0,format;
if (seconds < 0) {
seconds = Math.abs(seconds);
token = '';
prepend = 'In ';
}
while (format = time_formats[i++]) {
if (seconds < format[0]) {
if (format.length == 2) {
return (i>1?prepend:'') + format[1] + (i > 1 ? token : ''); // Conditional so we don't return Just Now Ago
} else {
return prepend + Math.round(seconds / format[2]) + ' ' + format[1] + (i > 1 ? token : '');
}
}
}
// overflow for centuries
if(seconds > 4730400000)
return Math.round(seconds / 4730400000) + ' Centuries' + token;
return date_str;
};