Преобразование строки HH: MM: SS в секунды только в javascript


99

У меня аналогичное требование: преобразовывать время в формате ЧЧ: ММ: СС только в секунды?

но в javascript. Я видел много примеров преобразования секунд в разные форматы, но не ЧЧ: ММ: СС в секунды. Любая помощь будет оценена.


упс .. извините за опечатку. да, пора чч: мм: сс
Шри Редди

Что DDвнутри HH:MM:DD?
Брайан Дрисколл,

2
Это тот же алгоритм, что и в этом вопросе PHP.
scottheckel 09

Ну .. Ч (час) == 3600 секунд, М (минута) == 60 секунд ... итак ..
MilkyWayJoe

1
Единственное решение, о котором я думаю, - это разделить строку в массиве, а затем умножить 3600 на час, умножить 60 на мин и добавить все с секундной частью. Это самое простое решение?
Шри Редди

Ответы:


194

Попробуй это:

var hms = '02:04:33';   // your input string
var a = hms.split(':'); // split it at the colons

// minutes are worth 60 seconds. Hours are worth 60 minutes.
var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); 

console.log(seconds);

3
Вот его прототип! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } ПРИМЕЧАНИЕ: символ || 0в конце подходит для любой реализации этого кода - он предотвращает проблемы с (все еще действующим) представлением времени ЧЧ: ММ (входные данные Chrome type = "time" будут выводиться в этом формате, когда секунды = 0).
Фатех Хальса

Awesome stuff dude
Эдди

у меня есть только hh:mmне secondsв этом случае что я должен доработать ..?
Мистер мир,

1
@AbdulWaheed Измените эту строку: var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); кvar seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova

4
Использование оператора «+» для преобразования числовой строки в число - не лучшая идея. Он короткий и выглядит «умно», но запутанный и не чистый код. Вместо этого используйте parseInt (x, 10). И избегайте однострочных. Также предотвратите ошибки неопределенным вводом. Например: это не строка, без «:» или только «ЧЧ: ММ». и т. д.
Доминик

68

Эта функция обрабатывает «ЧЧ: ММ: СС», а также «ММ: СС» или «СС».

function hmsToSecondsOnly(str) {
    var p = str.split(':'),
        s = 0, m = 1;

    while (p.length > 0) {
        s += m * parseInt(p.pop(), 10);
        m *= 60;
    }

    return s;
}

Хорошо, я сохраню его, если возникнут требования по истечению времени в любом формате. Благодарность!
Шри Редди

Лучший ответ для меня на данный момент
Резван Азфар Халим

Этот ответ полезен
Майк Арон

Что мне нужно изменить в вашей функции, чтобы использовать только в формате «ЧЧ: ММ»
noyruto88

39

Это можно сделать довольно устойчиво с помощью следующего:

'01:02:03'.split(':').reduce((acc,time) => (60 * acc) + +time);

Это связано с тем, что каждая единица времени в часах, минутах и ​​секундах на 60 больше, чем меньшая единица. Время делится на компоненты часов, минут и секунд, а затем сокращается до секунд за счет использования накопленного значения более высоких единиц, умноженного на 60 по мере прохождения каждой единицы.

+timeИспользуются для приведения времени числа.

В основном он делает: (60 * ((60 * HHHH) + MM)) + SS

Если пройдены только секунды, результатом будет строка, поэтому, чтобы исправить это, мы могли бы привести весь результат к int:

+('03'.split(':').reduce((acc,time) => (60 * acc) + +time));

это на самом деле чертовски умно .. вопрос в том, насколько быстро это по сравнению с расчетом
ThatBrianDude

4
Да, это умно, но это хороший пример создания сложного в сопровождении кода без практической выгоды. Он сохраняет 4 символа при минификации по сравнению с уменьшенной версией принятого ответа. Учитывая, что размер многих веб-страниц в настоящее время превышает 1 МБ, эта экономия несколько меньше, чем незначительная.
RobG

5
Несмотря на то, что этот ответ не столь же понятно, она корректно обрабатывать как HH:MM:SSи MM:SS, в то время как общепринятый ответ не делает.
ckeeney

1
У этого есть ошибка преобразования типа, если указана только секунда. Вам нужно явно инициализировать памятку с помощью 0, чтобы предотвратить это. Работает: '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);не работает, потому что возвращает неожиданную строку:'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
Felix Gertz

@FelixGertz Замечено, я исправлю исправление для этого случая.
Пол

13

Поскольку функция getTime объекта Date получает миллисекунды с 1970/01/01, мы можем сделать это:

var time = '12:23:00';
var seconds = new Date('1970-01-01T' + time + 'Z').getTime() / 1000;

1
Только что понял, это не работает с летним временем. Необходимо использовать фактическую дату
Ябларго

1
@Yablargo Спасибо. Предыдущая версия не очень хорошо работала с местным часовым поясом, поэтому я отредактировал ее, чтобы использовать формат даты и времени iso 8601 utc.
boskop

13

Преобразуйте hh:mm:ssстроку в секунды в одной строке. Допускается также h:m:sформат и mm:ss, и m:sт.д.

'08:45:20'.split(':').reverse().reduce((prev, curr, i) => prev + curr*Math.pow(60, i), 0)

4
Пожалуйста, объясните свой ответ
B001 ᛦ

Преобразуйте hh:mm:ssстроку в секунды в одной строке. Допускается также h:m:sформат и mm:ss, и m:sт.д.
Paul Скрыть

Хороший ответ! Но вы можете пропустить reverse(): '00: 01: 11'.split (':'). Reduce ((val, entry, i) => val + entry * (3600 / Math.pow (60, i)), 0 ) === 71
CMR

@CMR, интересный подход, но в случае mm:ssон не будет работать корректно.
Paul Hide

Math.pow очень медленный, и его можно избежать, как показано в других ответах, основанных на сокращении
Алехадро Ксалабардер

9

пытаться

time="12:12:12";
tt=time.split(":");
sec=tt[0]*3600+tt[1]*60+tt[2]*1;

5
ах, это * 1 - умный способ заставить его не выполнять конкатенацию строк :)
Дагг Наббит

5

Статический метод Javascript Date.UTC()делает свое дело:

alert(getSeconds('00:22:17'));

function getSeconds(time)
{
    var ts = time.split(':');
    return Date.UTC(1970, 0, 1, ts[0], ts[1], ts[2]) / 1000;
}

4

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

const getSeconds = (hms: string) : number => {
  const [hours, minutes, seconds] = hms.split(':');
  return (+hours) * 60 * 60 + (+minutes) * 60 + (+seconds);
};

2
new Date(moment('23:04:33', "HH:mm")).getTime()

Вывод: 1499755980000 (в миллисекундах) (1499755980000/1000) (в секундах)

Примечание: этот вывод вычисляет разницу с 1970-01-01 12: 0: 0 по настоящее время, и нам нужно реализовать момент.js


OP спросил секунды, а не миллисекунды
user7294900

Привет, user7294900, спасибо за ваш комментарий, я обновлю свой ответ, jst нам нужно разделить на 1000
ITsDEv

1

Эта функция также работает для MM: SS:

const convertTime = (hms) => {
        if (hms.length <3){
         return hms
        } else if (hms.length <6){
          const a = hms.split(':')
          return hms = (+a[0]) * 60 + (+a[1])
        } else {
          const a = hms.split(':')
          return hms = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2])
        }
      }


1

Взято из решения, данного Полом https://stackoverflow.com/a/45292588/1191101, но с использованием старой нотации функций, поэтому его также можно использовать в других движках js (например, java Rhino)

function strToSeconds (stime)
{
   return +(stime.split(':').reduce(function (acc,time) { return +(60 * acc) + +time }));
}

или просто еще один читаемый

function strToSeconds (stime)
{
  var tt = stime.split(':').reverse ();
  return ((tt.length >= 3) ? (+tt[2]): 0)*60*60 + 
         ((tt.length >= 2) ? (+tt[1]): 0)*60 + 
         ((tt.length >= 1) ? (+tt[0]): 0);
}

0

function parsehhmmsst(arg) {
	var result = 0, arr = arg.split(':')
	if (arr[0] < 12) {
		result = arr[0] * 3600 // hours
	}
	result += arr[1] * 60 // minutes
	result += parseInt(arr[2]) // seconds
	if (arg.indexOf('P') > -1) {  // 8:00 PM > 8:00 AM
		result += 43200
	}
	return result
}
$('body').append(parsehhmmsst('12:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('1:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('2:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('3:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('4:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('5:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('6:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('7:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('8:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('9:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('10:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('11:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('12:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('1:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('2:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('3:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('4:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('5:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('6:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('7:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('8:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('9:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('10:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('11:00:00 PM') + '<br>')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


0

Вы можете сделать это динамически - если вы столкнетесь не только с: ЧЧ: мм: сс, но также и с мм: сс или даже только сс.

var str = '12:99:07';
var times = str.split(":");
times.reverse();
var x = times.length, y = 0, z;
for (var i = 0; i < x; i++) {
    z = times[i] * Math.pow(60, i);
    y += z;
}
console.log(y);

0

Это наиболее ясное и простое для понимания решение:

function convertDurationtoSeconds(duration){
    const [hours, minutes, seconds] = duration.split(':');
    return Number(hours) * 60 * 60 + Number(minutes) * 60 + Number(seconds);
};

const input = '01:30:45';
const output = convertDurationtoSeconds(input);
console.log(`${input} is ${output} in seconds`);

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.