正确的时间显示

时间:2010-05-11 21:41:58

标签: javascript datetime time

我希望得到这个正确的,我对此有点沮丧。我想做的是让时间,日期和周数正确。

示例:

如果这篇文章是< 60分钟然后阅读:发布少于1分钟前

如果这篇文章是< 120分钟然后阅读:发布于1小时前

如果这篇文章是> 120分钟然后阅读:发布于1小时前

如果这篇文章是< 1440分钟然后阅读:发布于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';
    }

3 个答案:

答案 0 :(得分: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');
}

答案 1 :(得分:1)

你不需要写“elseif”因为一旦返回值,函数就不再执行了,所以写它是安全的:

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

另一个错误是你做了几个小时,但不是几分钟,几天和几周。 正如我在评论中写道,还有一个小时错字,你有12 * 60 * 60 - 我认为你的意思是2 * 60 * 60

答案 2 :(得分:0)

从技术上讲,你所拥有的是正确的。然而,这种化合物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这样的人。 : - )