Правильное отображение времени - PullRequest
0 голосов
/ 12 мая 2010

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

Пример:

если этому посту <60 минут, тогда прочитайте: Опубликовано менее 1 минуты назад </p>

если этому посту <120 минут, тогда прочитайте: Опубликовано 1 час назад </p>

если это сообщение> 120 минут, тогда прочитайте: Опубликовано 1 час назад

если этому сообщению <1440мин, то прочитайте его: Опубликовано 1 день назад </p>

если это сообщение> 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 ]

1 голос
/ 12 мая 2010

У вас было несколько опечаток и пропущенных дел:

    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 голос
/ 12 мая 2010

Вам не нужно писать "elseif", потому что как только возвращенное значение, функция больше не выполняется, поэтому можно безопасно написать:

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

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

0 голосов
/ 12 мая 2010

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

Возможно, вы захотите предварительно рассчитать все значения недель / дней / часов / и т. Д., А затем использовать их, чтобы сделать ваш код более читабельным: для примера посмотрите мой ответ .

В вашем случае вы бы сделали:

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. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...