Эффективно рассчитать минуты и секунды для отображения в формате MM: ss из секунд, используя OpenLaszlo / javascript? - PullRequest
2 голосов
/ 28 января 2009

В настоящее время я использую следующую функцию, основанную на примере из Интернета, она вызывается каждую секунду для отображения текущего прогресса в видеопотоке.

Могу ли я что-нибудь сделать, чтобы сделать это более эффективным?

function secondstominutes(secs){

var s;
if(secs > 60){
  var min = Math.floor(secs / 60);
  s = min < 10 ? "0" : "";
  s += min +":";
  secs = secs - min * 60;
} else {
  s = "00:";
}

if(secs < 10){
  s+= "0" + Math.floor(secs);
} else {
  s += Math.floor(secs);
}
return s;
}

Ответы [ 3 ]

4 голосов
/ 28 января 2009
function secondstominutes(secs)
{
   var mins = Math.floor(secs / 60);
   secs = secs % 60;

   return (mins < 10 ? "0" + mins : mins) 
          + ":"
          + (secs < 10 ? "0" + secs : secs);
}
1 голос
/ 29 января 2009

bobwienholt s - компактная, быстрая и понятная версия, и она очень похожа на ту, как я ее реализовал. Для забавы я провел профилирование нескольких различных решений и обнаружил, что это немного быстрее, однако это не так понятно, и я выполняю назначение, частично скрытое в утверждении:

function secondstominutes(secs)
{
    var m = (secs / 60) | 0;

   return (m < 10 ? "0" + m : m) 
          + ":"
          + ( ( secs %= 60 ) < 10 ? "0" + secs : secs);
}

Пояснение:

var m = (secs / 60) | 0;

Разделите секунды на 60 и двоичное «ИЛИ» результат с 0. Бинарное «ИЛИ» преобразует значение в целое число, и, с помощью 0, целая часть результата возвращается без изменения. Это быстрее, чем вызов Math.floor () , но менее понятно. Поскольку он преобразуется в целое число, вы ограничиваете продолжительность любого фильма до 2147483647 минут ≈ 35791394 часов ≈ 1491308 дней ≈ 4085 лет.

( secs %= 60 )

Это краткая форма выполнения (сек = сек% 60) . Он делит значение с на 60 и присваивает с напоминание (например, 61% 60 = 1). По профилированию я обнаружил, что было немного быстрее поместить это вычисление в оператор return, а не в собственную строку.

(m < 10 ? "0" + m : m)

Это вычисляет первый оператор m <10 </em>, и если это правда, выполняется второй оператор "0" + m , в противном случае третий: m . На английском языке: если m меньше 10, то в начале добавляется ноль, иначе значение возвращается как есть.

1 голос
/ 28 января 2009

Да, это может быть немного проще и использует меньше Math.floor, локальных переменных и т. Д. Вот мое предложение:

function secondstominutes(secs)
{
   return (Math.floor(secs/60))+":"+secs%60;
}

Это даст результат как:

0: 1 в течение 1 с 0:10 в течение 10 сек 1: 1 в течение 61 с

и т.д.

Если вам нужны пробелы и т.д., это можно сделать так:

function formatZero(number)
{
   return (number>9) ? number : "0"+number;
}

function secondstominutes(secs)
{
   return formatZero((Math.floor(secs/60)))+":"+formatZero(secs%60);
}

А это для навязчивой однострочной функции ppls;)

function secondstominutes(secs)
{
   return ((arguments[1]=(Math.floor(secs/60)))<10?"0":"")+arguments[1]+":"+((arguments[2]=secs%60)<10?"0":"") + arguments[2];
}
...