Недавно я работал над кодовым заданием, в котором вас просили разобрать строки, отформатированные как метки времени — «ЧЧ:ММ:СС». Предпосылка проблемы заключается в том, что друг просит вас написать функцию, которая будет возвращать метку времени его прогресса в фильме. Есть четыре аргумента.

  1. Отметка времени в формате «ЧЧ:ММ:СС», представляющая прошедшее время в фильме.
  2. Отметка времени в формате «ЧЧ:ММ:СС», представляющая общую продолжительность фильма.
  3. Строка, которая может быть любой из следующих: а) «Отчет о ходе выполнения» б) «Перемотка назад» в) «Быстрая перемотка вперед»
  4. Число от 0 до 100 или строка в формате «ЧЧ:ММ:СС».

Вот несколько примеров.

timestamp("01:00:00", "02:00:00", "Report Progress")
timestamp("02:00:00", "03:00:00", "Rewind", "00:20:00")
timestamp("01:00:00", "03:00:00", "Rewind", 50)
timestamp("00:20:00", "02:40:00", "Fast Forward", "01:25:00")
timestamp("00:30:00", "01:00:00", "Fast Forward", 50)

Моей первой мыслью было — «ДААААА». Во время вычислений приходится обрабатывать довольно много манипуляций со строками…

Но тут есть подвох!

Вы можете преобразовать строки в секунды, чтобы всегда иметь дело с секундами в секундах. Затем вы можете преобразовать обратно в формат временной метки, как только вы сделали свои расчеты.

Вот посмотрите на мое решение ниже.

function timestamp(a,b,c,d) {
  if (typeof d === 'undefined') { d = 'default' }
  a = secondParser(a)
  b = secondParser(b)
if (c === "Report Progress") {
    return (a/b)*100
  }
  
  if (c === "Rewind") {
    if (typeof d === 'string') {
      d = secondParser(d)
      let seconds = a - d
      return timestampParser(seconds)
    } else {
      let seconds = a*(d/100)
      return timestampParser(seconds)
    }
  }
  
  if (c === "Fast Forward") {
    if (typeof d === 'string') {
      d = secondParser(d)
      let seconds = a + d
      return timestampParser(seconds)
    } else {
      let seconds = (a*(d/100)) + a
      return timestampParser(seconds)
    }
  }
}
function secondParser(hms) {
  const a = hms.split(':')
  const seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); 
  return seconds
}
function timestampParser(seconds) {
  var date = new Date(1970,0,1);
  date.setSeconds(seconds);
  return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1")
}

Как видите, у меня есть две вспомогательные функции: secondParser() и timestampParser(). Они преобразуют значения в секунды или метки времени соответственно.

Давайте подробнее рассмотрим каждый.

function secondParser(hms) {
  const a = hms.split(':')
  const seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); 
  return seconds
}

Мы разделяем нашу временную метку (hms) на массив. Затем мы выполняем простую арифметику, чтобы изменить каждый индекс на секунды и сложить их все вместе. Мы умножаем ЧЧ на 60, чтобы преобразовать в минуты, и еще раз на 60, чтобы преобразовать в секунды. Мы умножаем ММ на 60, чтобы перевести в секунды. Ну и конечно СС уже в секундах. Затем добавьте их!

function timestampParser(seconds) {
  var date = new Date(1970,0,1);
  date.setSeconds(seconds);
  return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1")
}

Эта функция требует использования объекта Date JavaScript и его встроенных функций, а также небольшого количества регулярных выражений. Сначала мы определяем новый объект даты. Затем мы устанавливаем эту дату со значением наших секунд с помощью .setSeconds(). Затем мы создаем новую метку времени с помощью .toTimeString(). Мы используем регулярное выражение для создания нашего формата ЧЧ:ММ:СС с нашими двоеточиями.

Вы можете увидеть мой публичный repl.it здесь, чтобы увидеть, каковы были результаты для примеров, которые я перечислил выше.

Это испытание было очень забавным, и я с нетерпением жду, когда снова смогу использовать этот трюк!