2010-05-11 3 views
0

Я ищу, чтобы понять это правильно, и я немного разочарован этим. Я хочу, чтобы часы, дни и недели были правильными.Правильное отображение времени

Пример:

, если этот пост < 60мин старый, то он читал: Добавлено Менее 1 минуту назад

, если этот пост < 120мин старый, то есть это следующим образом: Добавлено 1 час назад

, если этот пост> 120мин старый, то есть это следующим образом: Добавлено 1 день назад

, если этот пост < 1440min старый, то он читал: Добавлено 1 день назад

если это сообщение> 1440min, тогда прочитайте: Опубликовано 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'; 
    } 
+0

Вам не нужно рассчитывать на 1 час, просто верните ' 1 hr ':), и вы установили его менее 12 часов, чтобы показать hr, я не думаю, что это специально – marianboda

+0

elapsedTime not lapsedTime;) –

ответ

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'); 
} 
0

Технически то, что у вас есть правильный. Однако этот состав if - это кошмар: совсем не легко понять, что он делает, или если он работает правильно, без мысли.

Возможно, вы захотите предварительно рассчитать все значения недель/дней/часов/etc, а затем использовать их, чтобы сделать ваш код более читаемым: посмотрите пример 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 

Я думаю, вы согласитесь, что это гораздо легче понять и проверить на правильность.

Редактировать: При проверке вашего вопроса на наличие очевидных проблем мне удалось пропустить ошибки, о которых все остальные указали. Я думаю, что это говорит: а) Я небрежный быстрый читатель, б) действительно сложно проверить if. :-)

1

Вам не нужно писать «ElseIf», потому что когда-то возвращается значение, функция не выполняет больше, так что это безопасно, чтобы написать:

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

и еще одна ошибка заключается в том, что вы делаете единственное количество часов, но не минут, дней и недель. как я написал в комментарии, есть также опечатка на один час, у вас есть 12 * 60 * 60 - я думаю, вы имели в виду 2 * 60 * 60

Смежные вопросы