【问题标题】:Javascript Relative Time - Display difference in Years & MonthsJavascript相对时间 - 显示年和月的差异
【发布时间】:2011-03-10 15:35:42
【问题描述】:

已经为此奋斗了太多天了。我正在尝试显示日期 (x) 的差异,现在如下所示:

  1. 如果差异正好是一年或几年 - 只需显示年份差异
  2. 如果 diff 是年和月(1 年,5 个月),那么显示它
  3. 如果差异是月份(没有年份),则显示月份差异
  4. 如果是天数,则显示天数。

希望这很清楚 - 我很累。

这是我的代码(注释行是我无法工作的部分):

function RelativeTime(x){
    var plural = '';

    var mins = 60, hour = mins * 60; day = hour * 24,
    week = day * 7, month = week * 4, year = day * 365;

if (x >= year){ x = (x / year)|0; dformat="year"; }
//else
//if ((x >= year)&& (x >= month)) { x = (x / year), (x / month)|0 ; dformat="year" , "month"; }
else if (x >= month) { x = (x / month)|0; dformat="month"; }
else if (x >= day*4) { x = (x / day)|0; dformat="day"; }
else if (x >= hour) { x = (x / hour)|0; dformat="hr"; }
else if (x >= mins) { x = (x / mins)|0; dformat="min"; }
else { x |= 0; dformat="sec"; }
if (x > 1) plural = 's';
if (x < 0) x = 0;
return x + ' ' + dformat + plural;
}

【问题讨论】:

  • RelativeTime() 中输入了什么,你能给我们一个样本x 吗?
  • 变量被传递。简而言之,我正在做的是找到所有团队成员的加入年龄。

标签: javascript


【解决方案1】:

试试看,这个http://jsfiddle.net/mk95J/5/

var age = '';

function RelativeTime(x){
    var ymwdhm = [ [31536000, 'year'],
                   [2419200, 'month'],
                   [604800, 'week'],
                   [86400, 'day'],
                   [3600, 'hour'],
                   [60, 'min'],
                   [1, 'sec'] ];

    for(var i=0;i<7;i++) {
        if(x >= ymwdhm[i][0]) {
            var res = parseInt(x / ymwdhm[i][0], 10);
            age += res;
            age += ymwdhm[i][1];
            age += res > 1 ? 's ' : ' '; // plural

            RelativeTime(x - (res * ymwdhm[i][0]));
            break;
        }
    }
}

RelativeTime( 35746121 );
document.write(age);  // 1year 1month 2weeks 6days 17hours 28mins 41 secs

【讨论】:

    【解决方案2】:

    我想你会想在你去的时候构建你的字符串,因为你想构建它。如果您只显示最高级别的差异(仅数年或数月),“else if”结构会很好。

    可能是这样的:

    function RelativeTime(x) {
    
    
        var mins = 60, hour = mins * 60; day = hour * 24,
             week = day * 7, month = week * 4, year = day * 365;
    
    
        var responseString = '';
    
        if (x >= year) {
          var numberOfYears = parseInt(x / year, 10);
          x = x - (numberOfYears * year);
          responseString += numberOfYears + ' year';
          if (numberOfYears > 1) {
              responseString += 's';
          }
          responseString += ' ';
        }
    
        if (x >= month) {
          var numberOfMonths = parseInt(x / month, 10);
          x = x - (numberOfMonths * month);
          responseString += numberOfMonths + ' month';
          if (numberOfMonths > 1) {
              responseString += 's';
          } 
          responseString += ' ';
        }
        return responseString;
    }
    
    // And so on ....
    
    document.write(RelativeTime(35746121));
    

    在那里也可以管理一些效率(看起来确实可以从那里出来一个函数来替换几乎重复的代码,并且您可能可以通过那里重用一些变量)。

    【讨论】:

    • 我认为问题在于我试图同时做高级别和(年,月)
    • 让我试着更清楚一点...如果成员于 2010 年 3 月 10 日加入,则差异为 1 年。但如果成员于 2010 年 1 月 10 日加入,则差异为 1 年 2 个月
    • 和显示是这样设置的 row += ''+ RelativeTime(json.joined) + '';
    • 我编辑了我的回复以显示整个工作流程并更正了几个拼写错误。它本质上是 erikb 发布的更详细的版本,根据您的描述,它可以满足您的需求。对此的回应是 1 年 1 个月。如果添加了额外的代码,它将继续运行。
    猜你喜欢
    • 2016-05-28
    • 2020-02-11
    • 2014-07-22
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多