Выходное человекообразное время

Я написал небольшую функцию, которая форматирует временную метку ms с понятным для человека способом. Я знаю, что есть много скриптов, но мне нужен был очень простой, который выводит только минуты и часы.

Мне было интересно, есть ли способ сократить или улучшить этот фрагмент кода, потому что мне кажется, что он очень длинный для тех немногих вещей, которые он на самом деле делает.

function prettyTime(ms) {
      var sec = ms / 1000,
          time,
          timeUnit;

      if(sec > 3600) {
          // Hours
          time = Math.round(sec / 3600);
          timeUnit = ' hr';
      } else if(sec > 60) {
          // Minutes
          time = Math.round(sec / 60);
          timeUnit = ' min';
      } else {
          return 'less than 1 min';  
      }

      if(time > 1) {
          timeUnit += 's';   
      }

      return 'about ' + time + timeUnit + 'ago';
}

alert(prettyTime(7600001));
11 голосов | спросил demrks 18 MaramTue, 18 Mar 2014 02:23:34 +04002014-03-18T02:23:34+04:0002 2014, 02:23:34

1 ответ


9

Надеюсь, что это будет полезно -

function getRelativeTime(ms){
    var SECOND_MS = 1000;
    var MINUTE_MS = 60 * SECOND_MS;
    var HOUR_MS = 60 * MINUTE_MS;
    var DAY_MS = 24 * HOUR_MS;
    var WEEK_MS = 7 * DAY_MS;
    var MONTH_MS = 30 * DAY_MS;

    var lookup = ["months", "weeks", "days", "hours", "minutes", "seconds"];
    var values = [];
    values.push(ms / MONTH_MS); ms %= MONTH_MS;
    values.push(ms / WEEK_MS); ms %= WEEK_MS;
    values.push(ms / DAY_MS); ms %= DAY_MS;
    values.push(ms / HOUR_MS); ms %= HOUR_MS;
    values.push(ms / MINUTE_MS); ms %= MINUTE_MS;
    values.push(ms / SECOND_MS); ms %= SECOND_MS;

    var pretty = "about "; 
    for(var i=0 ; i <values.length; i++){
        var val = Math.round(values[i]);
        if(val <= 0) continue;

        pretty += val + " " + lookup[i] + " ago";
        break;
    }
    return pretty;
}


getRelativeTime(10000);

Выход:

about 10 seconds ago

Вы можете легко настроить вышеуказанный код для своего «xx часов и xx минут назад». Просто измените цикл for следующим образом:

for(var i=0 ; i <values.length; i++){
    var val = Math.round(values[i]);
    if(val <= 0) continue;

    pretty += val + " " + lookup[i];

    var nextval = Math.round(values[i+1]);
    if(i+1 < values.length && nextval > 0){
      pretty += " and " + nextval + " " + lookup[i+1] + " ago";
    }
    else {
      pretty += " ago";
    }
    break;
}

Выход

getRelativeTime (100000);

about 2 minutes and 40 seconds ago

getRelativeTime (1000000);

about 17 minutes and 40 seconds ago

UPDATE:

  

Math.round вызывает неправильный результат в приведенном выше коде, Math.floor больше   необходимо.

ответил Kevindra 18 MaramTue, 18 Mar 2014 03:25:46 +04002014-03-18T03:25:46+04:0003 2014, 03:25:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132