Перетворити HH: MM: рядок SS у секунди лише у javascript


98

У мене така ж вимога, як ця: Перетворити час у форматі HH: MM: SS лише на секунди?

але в javascript. Я бачив багато прикладів перетворення секунд у різні формати, але не HH: MM: SS у секунди. Будь-яка допомога буде вдячна.


ой .. вибачте за друкарську помилку. так, час hh: mm: ss
Шрі Редді

Що таке DDin HH:MM:DD?
Брайан Дрісколл

2
Це той самий алгоритм, що і в тому питанні PHP.
Скотткель

Ну .. H (Година) == 3600 секунд, M (хвилина) == 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кінець добре підходить для будь-якої реалізації цього коду - він запобігає проблемам із (все ще діючим) поданням часу HH: MM (входи Chrome типу = "час" виводяться в цьому форматі, коли секунди = 0).
Fateh Khalsa

Awesome stuff чувак
Eddy

у мене є лише 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;
Рова

4
Використання оператора "+" для перетворення числового рядка в число не є гарною ідеєю. Він короткий і виглядає «розумно», але заплутаний і не чистий код. Замість цього використовуйте parseInt (x, 10). І уникайте однокласника. Також запобігайте помилкам за допомогою невизначеного введення. Наприклад: це не рядок, не має ":" або лише "HH: MM". тощо
Домінік

68

Ця функція обробляє "HH: MM: SS", а також "MM: SS" або "SS".

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;
}

Приємно, я дотримаю його, якщо з’явиться вимога щодо часу, якогось формату. Дякую!
Шрі Редді

На сьогодні найкраща відповідь для мене
Резван Азфар Халім

Ця відповідь корисна
Mike Aron

Що мені потрібно змінити у вашій функції, щоб використовувати лише у форматі 'HH: MM'
noyruto88

37

Це можна зробити досить еластично за допомогою наступного:

'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);
Фелікс Герц,

@FelixGertz Добре помічений, я відредагую виправлення для цього випадку.
Пол

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 дуже повільний і його можна уникнути, як показано в інших відповідях на основі зменшення
Alejadro Xalabarder

12

Оскільки функція getTime об'єкта Date отримує мілісекунди з 01.01.1970, ми можемо зробити це:

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

1
Щойно зрозумівши, це не працює з переходом на літній час. Потрібно
вказати

1
@Yablargo Дякую. Попередня версія не дуже добре працювала з місцевим часовим поясом, тому я відредагував її, використовуючи формат iso 8601 utc datetime.
boskop

9

спробуй

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

5
ах, це * 1 - розумний спосіб змусити його не робити конкатенацію рядків :)
Dagg Nabbit

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) (у секундах)

Примітка: цей результат обчислення відрізняється від 01.01.19 12: 0: 0 до теперішнього часу, і нам потрібно реалізувати moment.js


OP попросив секунди, а не мілісекунди
користувач7294900

Привіт користувач 7294900, Thx за твій коментар, я оновлю свою відповідь, тому що нам потрібно розділити на 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

Ви можете робити це динамічно - на випадок, коли ви стикаєтесь не тільки: HH: mm: ss, а й mm: ss, або навіть ss окремо.

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.