【问题标题】:Correct Time Display正确的时间显示
【发布时间】:2010-05-11 21:41:57
【问题描述】:

我正在寻找正确的方法,但我对此感到有些沮丧。我想要做的是正确的小时、天和周。

例子:

如果这篇文章的发布时间

如果这篇文章的发布时间

如果这篇文章的历史 > 120 分钟,请阅读:1 小时前发布

如果这篇文章的发布时间

如果这篇文章的历史 > 1440 分钟,请阅读:2 天前发布

是吗?

这是我目前所拥有的:

if (lapsedTime < 60) {
        return '< 1 mimute';
    } else if (lapsedTime < (60*60)) {
        return Math.round(lapsedTime / 60) + 'minutes';
    } else if (lapsedTime < (12*60*60)) {
        return Math.round(lapsedTime / 2400) + 'hr';
    } else if (lapsedTime < (24*60*60)) {
        return Math.round(lapsedTime / 3600) + 'hrs';
    } else if (lapsedTime < (7*24*60*60)) {
        return Math.round(lapsedTime / 86400) + 'days';
    } else {
        return Math.round(lapsedTime / 604800) + 'weeks';
    }

【问题讨论】:

  • 您不必计算 1 小时,只需返回 '1 hr' :) 并且您已将其设置为不到 12 小时以显示 hr,我不认为这是故意的
  • elapsedTime 不是 lapsedTime ;)

标签: javascript datetime time


【解决方案1】:

您有一些错别字和漏掉的案例:

    if (lapsedTime < 60) {
        return '< 1 minute';
    } else if (lapsedTime < (2*60*60)) {     // Missed this case
        return '1 minute';
    } else if (lapsedTime < (60*60)) {
        return Math.round(lapsedTime / 60) + ' minutes';
    } else if (lapsedTime < (2*60*60)) {     // This should be 2, not 12
        return '1 hour';
    } else if (lapsedTime < (24*60*60)) {
        return Math.round(lapsedTime / 3600) + ' hours';
    } else if (lapsedTime < (2*24*60*60)) {
        return '1 day';
    } else if (lapsedTime < (7*24*60*60)) {
        return Math.round(lapsedTime / 86400) + ' days';
    } else if (lapsedTime < (2*7*24*60*60)) {  // Missed this case
        return '1 week';
    } else {
        return Math.round(lapsedTime / 604800) + ' weeks';
    }

我同意更好的方法是计算周、天、小时、分钟,并使用它们来格式化字符串:

function formatTime(t, tStr) {
    // Singular case
    if(t==1) { return t+' '+tStr; }

    // Plural case
    return t+' '+tStr+'s';
}

function timeString(lapsedTime) {
    // These could be "round" or "floor", depending on what you want
    var minutes = Math.floor(lapsedTime/60);
    var hours = Math.floor(lapsedTime/3600);
    var days = Math.floor(lapsedTime/86400);
    var weeks = Math.floor(lapsedTime/604800);
    var years = Math.floor(lapsedTime/31536000);

    if(minutes == 0) {  return '< 1 minute';                    }
    if(hours == 0)   {  return formatTime(minutes, 'minute');   }
    if(days == 0)    {  return formatTime(hours, 'hour');       }
    if(weeks == 0)   {  return formatTime(days, 'day');         }
    if(years == 0)   {  return formatTime(weeks, 'week');       }
    return formatTime(years, 'year');
}

【讨论】:

    【解决方案2】:

    你不需要写“elseif”,因为一旦返回值,函数就不再执行,所以写起来很安全:

    if (time < 60) return '< 1 minute';
    if (time < 120) return '1 minute';
    if (time < 60*60) ...
    ...
    

    另一个错误是你用单数表示小时,而不是用分钟、几天和几周。 正如我在评论中所写,还有一个一小时的错字,你有 12*60*60 - 我想你的意思是 2*60*60

    【讨论】:

      【解决方案3】:

      从技术上讲,您所拥有的是正确的。然而,if 的复合物是一场噩梦:完全不易于理解它的作用,或者它是否正常工作,不假思索。

      您可能希望预先计算所有周/天/小时/等值,然后使用这些值使您的代码更具可读性:例如,查看 my answer here。

      在你的情况下,你会这样做:

      var weeks = Math.round(lapsedTime / 604800);
      var days = Math.round(lapsedTime / 86400);
      // etc for the other quantities
      
      if (weeks >= 1) {
          return weeks + " weeks";
      }
      else if (days >= 1) {
          return days + " days";
      }
      
      // etc
      

      我想你会同意这更容易理解和验证正确性。

      编辑:在扫描您的问题以查找明显问题时,我设法错过了所有其他人指出的错误。我认为这说明的是:a)我是一个草率的快速阅读者,b)确实很难验证这样的if。 :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-07
        • 2018-02-05
        • 1970-01-01
        相关资源
        最近更新 更多