Недавно я работал над кодовым заданием, в котором вас просили разобрать строки, отформатированные как метки времени — «ЧЧ:ММ:СС». Предпосылка проблемы заключается в том, что друг просит вас написать функцию, которая будет возвращать метку времени его прогресса в фильме. Есть четыре аргумента.
- Отметка времени в формате «ЧЧ:ММ:СС», представляющая прошедшее время в фильме.
- Отметка времени в формате «ЧЧ:ММ:СС», представляющая общую продолжительность фильма.
- Строка, которая может быть любой из следующих: а) «Отчет о ходе выполнения» б) «Перемотка назад» в) «Быстрая перемотка вперед»
- Число от 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 здесь, чтобы увидеть, каковы были результаты для примеров, которые я перечислил выше.
Это испытание было очень забавным, и я с нетерпением жду, когда снова смогу использовать этот трюк!