2008-10-03 23 views
5

比方说,我有两个字符串在JavaScript:如何呈现JavaScript中两个时间戳之间的上下文差异?

var date1 = '2008-10-03T20:24Z' 
var date2 = '2008-10-04T12:24Z' 

我怎么会来的结果,像这样:

'4 weeks ago' 

'in about 15 minutes' 

(应支持过去和未来)。

有过去的差异的解决方案,但我还没有找到一个支持未来时间差异以及。

这是我试过的解决方案:

John Resig's Pretty DateZach Leatherman's modification

积分为一个jQuery的解决方案。

+0

您已经有过去差异的解决方案?交换日期,解决,从最后剥离“前”,前置“约”。完成。 ;) – moonshadow 2008-10-03 21:15:58

+0

刚刚发布的解决方案我试过 - 未来的日期不能很好地工作 – 2008-10-03 21:17:46

回答

7

看着你链接的解决方案...它实际上就像我轻浮的评论一样简单!

下面是一个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; 
    }; 
3

嘿 - 我其实写了一个函数来完成昨天这个确切的事情(这不是这台电脑,所以我只好试着记住它)

我延长日期原型类,但是这可以很容易地被放入常规函数中。

Date.prototype.toRelativeTime = function(otherTime) { 
    // if no parameter is passed, use the current date. 
    if (otherTime == undefined) otherTime = new Date(); 

    var diff = Math.abs(this.getTime() - otherTime.getTime())/1000; 

    var MIN = 60,  // some "constants" just 
     HOUR = 3600,  // for legibility 
     DAY = 86400 
    ; 
    var out, temp; 
    if (diff < MIN) { 
     out = "Less than a minute"; 

    } else if (diff < 15 * MIN) { 
     // less than fifteen minutes, show how many minutes 
     temp = Math.round(diff/MIN); 
     out = temp + " minute" + (temp == 1 ? "" : "s"); 
     // eg: 12 minutes 
    } else if (diff < HOUR) { 
     // less than an hour, round down to the nearest 5 minutes 
     out = (Math.floor(diff/(5 * MIN)) * 5) + " minutes"; 
    } else if (diff < DAY) { 
     // less than a day, just show hours 
     temp = Math.round(diff/HOUR); 
     out = temp + " hour" + (temp == 1 ? "" : "s"); 
    } else if (diff < 30 * DAY) { 
     // show how many days ago 
     temp = Math.round(diff/DAY); 
     out = temp + " day" + (temp == 1 ? "" : "s"); 
    } else if (diff < 90 * DAY) { 
     // more than 30 days, but less than 3 months, show the day and month 
     return this.getDate() + " " + this.getShortMonth(); // see below 
    } else { 
     // more than three months difference, better show the year too 
     return this.getDate() + " " + this.getShortMonth() + " " + this.getFullYear(); 
    } 
    return out + (this.getTime() > otherTime.getTime() ? " from now" : " ago"); 

}; 

Date.prototype.getShortMonth = function() { 
    return ["Jan", "Feb", "Mar", 
      "Apr", "May", "Jun", 
      "Jul", "Aug", "Sep", 
      "Oct", "Nov", "Dec"][this.getMonth()]; 
}; 

// sample usage: 
var x = new Date(2008, 9, 4, 17, 0, 0); 
alert(x.toRelativeTime()); // 9 minutes from now 

x = new Date(2008, 9, 4, 16, 45, 0, 0); 
alert(x.toRelativeTime()); // 6 minutes ago 

x = new Date(2008, 11, 1); // 1 Dec 

x = new Date(2009, 11, 1); // 1 Dec 2009 
相关问题