Javascript: преобразование строки, т.е. "1 час 2 минуты" до времени в секундах
Я нашел много плагинов для такого рода функций с датой, например, так как я не смог найти что-то, что преобразует строку временного интервала ("2 минуты", "10 секунд", "1 час"). и 4 минуты "и т. д.) до времени в секундах.
Есть идеи или плагины, о которых вы знаете? Благодарю.
3 ответа
Я бы написал функцию, которая неоднократно совпадает(digit+) (timeUnit)
"и делает арифметику в миллисекундах, потому что они являются более распространенными единицами. Как-то так:
var timespanMillis = (function() {
var tMillis = {
second: 1000,
min: 60 * 1000,
minute: 60 * 1000,
hour: 60 * 60 * 1000 // etc.
};
return function(s) {
var regex = /(\d+)\s*(second|min|minute|hour)/g, ms=0, m, x;
while (m = regex(s)) {
x = Number(m[1]) * (tMillis[m[2]]||0);
ms += x;
}
return x ? ms : NaN;
};
})();
timespanMillis("2 mins"); // => 120000
timespanMillis("10 seconds"); // => 10000
timespanMillis("1 hour and 4 minutes"); // => 3840000
timespanMillis("Foobar"); // => NaN
Хитрость заключается в том, чтобы синхронизировать объект поиска tMillis с регулярным выражением, но это не должно быть слишком сложно; например, вы можете создать регулярное выражение в замыкании, присоединив свойства tMillis в качестве исходной строки.
Я написал библиотеку с открытым исходным кодом MgntUtils на java (не javascript), которая частично отвечает этому требованию. Содержит статический метод parsingStringToTimeInterval(String value)
этот метод анализирует строку, которая, как ожидается, будет содержать некоторое значение временного интервала - числовое значение с необязательным суффиксом единицы времени. Например, строка "38s" будет проанализирована как 38 секунд, "24m" - 24 минуты, "4h" - 4 часа, "3d" - 3 дня и "45" как 45 миллисекунд. Поддерживаемые суффиксы: "s" для секунд, "m" для минут, "h" для часов и "d" для дней. Считается, что строка без суффикса содержит значение в миллисекундах. Суффиксы нечувствительны к регистру. Если предоставленная строка содержит неподдерживаемый суффикс или содержит отрицательное числовое значение или ноль или содержит не числовое значение, то генерируется исключение IllegalArgumentException. Этот метод возвращает класс TimeInterval - класс, также определенный в этой библиотеке. По сути, он содержит два свойства с соответствующими методами получения и установки: long "value" и java.util.concurrent.TimeUnit. Но в дополнение к методам получения и установки этот класс имеет методы toMillis(), toSeconds(), toMinutes(), toHours() toDays(). Эти методы возвращают длинное значение в указанном масштабе времени (так же, как соответствующие методы в классе java.util.concurrent.TimeUnit)
Этот метод может быть очень полезен для анализа свойств временных интервалов, таких как время ожидания или периоды ожидания, из файлов конфигурации. Это устраняет ненужные вычисления от различных временных масштабов до миллисекунд назад и вперед. Учтите, что у вас есть свойство methodInvokingInterval, которое необходимо установить на 5 дней. Таким образом, чтобы установить значение в миллисекундах, вам необходимо рассчитать, что 5 дней - это 432000000 миллисекунд (очевидно, это не невыполнимая задача, но раздражает и подвержена ошибкам), а затем любой, кто увидит значение 432000000, должен будет рассчитать его до 5 дней, которые расстраивает Но используя этот метод, вы получите значение свойства "5d" и вызов кода
long seconds = TextUtils.parsingStringToTimeInterval("5d").toSeconds();
решит вашу проблему конверсии. Очевидно, что это не слишком сложная функция, но она может добавить простоту и ясность в ваши файлы конфигурации и сэкономить некоторое разочарование и "глупый" просчет в ошибках миллисекунд. Вот ссылка на статью, которая описывает библиотеку MgntUtils, а также где ее взять: MgntUtils
Как только вы определились с форматом, вам нужно написать сценарий, который преобразует ваш формат времени в стандартный формат или просто извлекает необходимые числа из вашего формата.
После этого вы можете использовать конструктор даты для разбора даты, а затем написать get секунд из метода getTime()
var d=new Date("October 12, 1987 10:23:00");
document.write(d.getTime() + " milliseconds since 1970/01/01");