Как я могу преобразовать секунды в HH-MM-SS
строку, используя JavaScript?
Как я могу преобразовать секунды в HH-MM-SS
строку, используя JavaScript?
Ответы:
Вы не знаете свиданий ? это надо знать.
Используя datejs, просто напишите что-то вроде:
(new Date).clearTime()
.addSeconds(15457)
.toString('H:mm:ss');
--Обновить
В настоящее время date.js устарел и не поддерживается, поэтому используйте « Moment.js », что гораздо лучше, как указал TJ Crowder.
- обновление 2
Пожалуйста, используйте @ Frank's решение в одну строку:
new Date(SECONDS * 1000).toISOString().substr(11, 8)
На сегодняшний день это лучшее решение.
TypeError: Object [object Date] has no method 'clearTime'
.
Вы можете сделать это без какой-либо внешней библиотеки JavaScript с помощью метода JavaScript Date, как показано ниже:
var date = new Date(null);
date.setSeconds(SECONDS); // specify value for SECONDS here
var result = date.toISOString().substr(11, 8);
Или, согласно комментарию @Frank ; один лайнер:
new Date(SECONDS * 1000).toISOString().substr(11, 8);
new Date(SECONDS * 1000).toISOString().substr(11, 8);
Object doesn't support property or method 'toISOString'
Я не думаю, что какая-либо встроенная функция стандартного объекта Date сделает это для вас более удобным способом, чем простая математика.
hours = Math.floor(totalSeconds / 3600);
totalSeconds %= 3600;
minutes = Math.floor(totalSeconds / 60);
seconds = totalSeconds % 60;
Пример:
0.05
в hours
переменной вернулось бы 180 секунд . Я положил его внутрь, чтобы parseInt
исправить это для моего случая, но я не думаю, что это будет точно для всего. Тем не менее, это помогло мне, так что спасибо!
parseInt
его для анализа строк , а не манипулирования числами. Math.floor
будет соответствующей операцией здесь.
seconds = Math.floor(totalSeconds % 60);
. Я тоже получил там десятичный результат.
totalSeconds % 60
может иметь только дробную часть, если totalSeconds
имеет дробную часть. Если вы хотите выступить, это будет зависеть от того, хотите ли вы потерять эту информацию или сохранить ее. (Другие операции на полу, которые мы делаем, не теряют никакой информации, потому что они просто очищают данные, которые в конечном итоге minutes
и seconds
.)
console.log( hours +':'+ ('0'+minutes).slice(-2) +':'+ ('0'+seconds).slice(-2) );
Я знаю, что это довольно старое, но ...
ES2015:
var toHHMMSS = (secs) => {
var sec_num = parseInt(secs, 10)
var hours = Math.floor(sec_num / 3600)
var minutes = Math.floor(sec_num / 60) % 60
var seconds = sec_num % 60
return [hours,minutes,seconds]
.map(v => v < 10 ? "0" + v : v)
.filter((v,i) => v !== "00" || i > 0)
.join(":")
}
Это выведет:
toHHMMSS(129600) // 36:00:00
toHHMMSS(13545) // 03:45:45
toHHMMSS(180) // 03:00
toHHMMSS(18) // 00:18
Как указал Клитон в своем ответе , для этого можно использовать moment.js :
moment().startOf('day')
.seconds(15457)
.format('H:mm:ss');
moment().startOf('year').seconds(30000000).format('DDD HH:mm:ss')
.
.format('YYYY DDD HH:mm:ss')
function formatSeconds(seconds)
{
var date = new Date(1970,0,1);
date.setSeconds(seconds);
return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
}
var timeInSec = "661"; //even it can be string
String.prototype.toHHMMSS = function () {
/* extend the String by using prototypical inheritance */
var seconds = parseInt(this, 10); // don't forget the second param
var hours = Math.floor(seconds / 3600);
var minutes = Math.floor((seconds - (hours * 3600)) / 60);
seconds = seconds - (hours * 3600) - (minutes * 60);
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
var time = hours+':'+minutes+':'+seconds;
return time;
}
alert("5678".toHHMMSS()); // "01:34:38"
console.log(timeInSec.toHHMMSS()); //"00:11:01"
мы можем сделать эту функцию намного короче и четче, но это уменьшает удобочитаемость, поэтому мы напишем ее как можно более простой и стабильной.
или вы можете проверить это, работая здесь :
Вот расширение класса Number. toHHMMSS () преобразует секунды в строку чч: мм: сс.
Number.prototype.toHHMMSS = function() {
var hours = Math.floor(this / 3600) < 10 ? ("00" + Math.floor(this / 3600)).slice(-2) : Math.floor(this / 3600);
var minutes = ("00" + Math.floor((this % 3600) / 60)).slice(-2);
var seconds = ("00" + (this % 3600) % 60).slice(-2);
return hours + ":" + minutes + ":" + seconds;
}
// Usage: [number variable].toHHMMSS();
// Here is a simple test
var totalseconds = 1234;
document.getElementById("timespan").innerHTML = totalseconds.toHHMMSS();
// HTML of the test
<div id="timespan"></div>
Легко следовать версии для новичков:
var totalNumberOfSeconds = YOURNUMBEROFSECONDS;
var hours = parseInt( totalNumberOfSeconds / 3600 );
var minutes = parseInt( (totalNumberOfSeconds - (hours * 3600)) / 60 );
var seconds = Math.floor((totalNumberOfSeconds - ((hours * 3600) + (minutes * 60))));
var result = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds);
console.log(result);
Эта функция должна сделать это:
var convertTime = function (input, separator) {
var pad = function(input) {return input < 10 ? "0" + input : input;};
return [
pad(Math.floor(input / 3600)),
pad(Math.floor(input % 3600 / 60)),
pad(Math.floor(input % 60)),
].join(typeof separator !== 'undefined' ? separator : ':' );
}
Не передавая разделитель, он использует :
(по умолчанию) разделитель:
time = convertTime(13551.9941351); // --> OUTPUT = 03:45:51
Если вы хотите использовать -
в качестве разделителя, просто передайте его как второй параметр:
time = convertTime(1126.5135155, '-'); // --> OUTPUT = 00-18-46
Смотрите также эту скрипку .
:
по умолчанию для separator
параметра, как я уже объяснил. Это сделано заявлением typeof separator !== 'undefined' ? separator : ':'
. Кроме того, ваша функция в значительной степени идентична моей, за исключением некоторых косметических изменений, и они оба должны давать одинаковый результат ... за исключением того, что моя версия имеет гораздо лучшую поддержку браузера. Ваша не будет работать в ЛЮБОЙ версии Internet Explorer или MS Edge <14.
ниже приведен код, который преобразует секунды в формат чч-мм-сс:
var measuredTime = new Date(null);
measuredTime.setSeconds(4995); // specify value of SECONDS
var MHSTime = measuredTime.toISOString().substr(11, 8);
Получить альтернативный метод из Конвертировать секунды в формат HH-MM-SS в JavaScript
Для особого случая HH: MM: SS.MS (например, «00: 04: 33.637»), используемого FFMPEG для указания миллисекунд .
[-] [HH:] MM: SS [.m ...]
HH выражает количество часов, MM - количество минут максимум для 2 цифр, а SS - количество секунд максимум для 2 цифр. М в конце выражает десятичное значение для СС.
/* HH:MM:SS.MS to (FLOAT)seconds ---------------*/
function timerToSec(timer){
let vtimer = timer.split(":")
let vhours = +vtimer[0]
let vminutes = +vtimer[1]
let vseconds = parseFloat(vtimer[2])
return vhours * 3600 + vminutes * 60 + vseconds
}
/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
let o = new Date(0)
let p = new Date(sec*1000)
return new Date(p.getTime()-o.getTime())
.toISOString()
.split("T")[1]
.split("Z")[0]
}
/* Example: 7hours, 4 minutes, 33 seconds and 637 milliseconds */
const t = "07:04:33.637"
console.log(
t + " => " +
timerToSec(t) +
"s"
)
/* Test: 25473 seconds and 637 milliseconds */
const s = 25473.637 // "25473.637"
console.log(
s + "s => " +
secToTimer(s)
)
Пример использования, транспортный таймер в миллисекундах:
/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
let o = new Date(0)
let p = new Date(sec*1000)
return new Date(p.getTime()-o.getTime())
.toISOString()
.split("T")[1]
.split("Z")[0]
}
let job, origin = new Date().getTime()
const timer = () => {
job = requestAnimationFrame(timer)
OUT.textContent = secToTimer((new Date().getTime() - origin) / 1000)
}
requestAnimationFrame(timer)
span {font-size:4rem}
<span id="OUT"></span>
<br>
<button onclick="origin = new Date().getTime()">RESET</button>
<button onclick="requestAnimationFrame(timer)">RESTART</button>
<button onclick="cancelAnimationFrame(job)">STOP</button>
Пример использования, связанный с медиа-элементом
/* Seconds to (STRING)HH:MM:SS.MS --------------*/
function secToTimer(sec){
let o = new Date(0)
let p = new Date(sec*1000)
return new Date(p.getTime()-o.getTime())
.toISOString()
.split("T")[1]
.split("Z")[0]
}
VIDEO.addEventListener("timeupdate", function(e){
OUT.textContent = secToTimer(e.target.currentTime)
}, false)
span {font-size:4rem}
<span id="OUT"></span><br>
<video id="VIDEO" width="400" controls autoplay>
<source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
</video>
Вне вопроса эти функции написаны на php:
<?php
/* HH:MM:SS to (FLOAT)seconds ------------------*/
function timerToSec($timer){
$vtimer = explode(":",$timer);
$vhours = (int)$vtimer[0];
$vminutes = (int)$vtimer[1];
$vseconds = (float)$vtimer[2];
return $vhours * 3600 + $vminutes * 60 + $vseconds;
}
/* Seconds to (STRING)HH:MM:SS -----------------*/
function secToTimer($sec){
return explode(" ", date("H:i:s", $sec))[0];
}
+ "." + p.getMilliseconds()
, просто используя new Date(p.getTime()-o.getTime()).toISOString().split("T")[1].split("Z")[0]
var time1 = date1.getTime();
var time2 = date2.getTime();
var totalMilisec = time2 - time1;
alert(DateFormat('hh:mm:ss',new Date(totalMilisec)))
/* ----------------------------------------------------------
* Field | Full Form | Short Form
* -------------|--------------------|-----------------------
* Year | yyyy (4 digits) | yy (2 digits)
* Month | MMM (abbr.) | MM (2 digits)
| NNN (name) |
* Day of Month | dd (2 digits) |
* Day of Week | EE (name) | E (abbr)
* Hour (1-12) | hh (2 digits) |
* Minute | mm (2 digits) |
* Second | ss (2 digits) |
* ----------------------------------------------------------
*/
function DateFormat(formatString,date){
if (typeof date=='undefined'){
var DateToFormat=new Date();
}
else{
var DateToFormat=date;
}
var DAY = DateToFormat.getDate();
var DAYidx = DateToFormat.getDay();
var MONTH = DateToFormat.getMonth()+1;
var MONTHidx = DateToFormat.getMonth();
var YEAR = DateToFormat.getYear();
var FULL_YEAR = DateToFormat.getFullYear();
var HOUR = DateToFormat.getHours();
var MINUTES = DateToFormat.getMinutes();
var SECONDS = DateToFormat.getSeconds();
var arrMonths = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
var arrDay=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var strMONTH;
var strDAY;
var strHOUR;
var strMINUTES;
var strSECONDS;
var Separator;
if(parseInt(MONTH)< 10 && MONTH.toString().length < 2)
strMONTH = "0" + MONTH;
else
strMONTH=MONTH;
if(parseInt(DAY)< 10 && DAY.toString().length < 2)
strDAY = "0" + DAY;
else
strDAY=DAY;
if(parseInt(HOUR)< 10 && HOUR.toString().length < 2)
strHOUR = "0" + HOUR;
else
strHOUR=HOUR;
if(parseInt(MINUTES)< 10 && MINUTES.toString().length < 2)
strMINUTES = "0" + MINUTES;
else
strMINUTES=MINUTES;
if(parseInt(SECONDS)< 10 && SECONDS.toString().length < 2)
strSECONDS = "0" + SECONDS;
else
strSECONDS=SECONDS;
switch (formatString){
case "hh:mm:ss":
return strHOUR + ':' + strMINUTES + ':' + strSECONDS;
break;
//More cases to meet your requirements.
}
}
Я просто хотел дать небольшое объяснение хорошему ответу выше:
var totalSec = new Date().getTime() / 1000;
var hours = parseInt( totalSec / 3600 ) % 24;
var minutes = parseInt( totalSec / 60 ) % 60;
var seconds = totalSec % 60;
var result = (hours < 10 ? "0" + hours : hours) + "-" + (minutes < 10 ? "0" + minutes : minutes) + "-" + (seconds < 10 ? "0" + seconds : seconds);
Во второй строке, поскольку в 1 часе 3600 секунд, мы делим общее количество секунд на 3600, чтобы получить общее количество часов. Мы используем parseInt для удаления любого десятичного числа. Если totalSec был 12600 (3 с половиной часа), то parseInt (totalSec / 3600) вернул бы 3, так как у нас будет 3 полных часа. Зачем нам нужен% 24 в этом случае? Если мы превышаем 24 часа, скажем, у нас есть 25 часов (90000 секунд), то по модулю здесь мы снова вернемся к 1, а не к 25. Это ограничивает результат в пределах 24-часового лимита, так как есть 24 часа В течение одного дня.
Когда вы видите что-то вроде этого:
25 % 24
Думайте об этом так:
25 mod 24 or what is the remainder when we divide 25 by 24
Вовлечение в эту старую ветку - ОП указывал ЧЧ: ММ: СС, и многие решения работают, пока вы не поймете, что вам нужно более 24 часов в списке. И, может быть, вы не хотите больше, чем одну строку кода. Ну вот:
d=(s)=>{f=Math.floor;g=(n)=>('00'+n).slice(-2);return f(s/3600)+':'+g(f(s/60)%60)+':'+g(s%60)}
Возвращает H +: MM: SS. Чтобы использовать это, просто используйте:
d(91260); // returns "25:21:00"
d(960); // returns "0:16:00"
... Я пытался заставить его использовать наименьшее количество кода для хорошего однострочного подхода.
Вы пытались добавить секунды к объекту Date?
var dt = new Date();
dt.addSeconds(1234);
Пример: https://jsfiddle.net/j5g2p0dc/5/
Обновлено: пример ссылки отсутствует, поэтому я создал новую.
addSeconds
для объекта Date, как Date.prototype.addSeconds = function(seconds){...}
. Да, работает, спасибо за обновление.
Вот функция для преобразования секунд в формат чч-мм-сс на основе ответа Powtac здесь
/**
* Convert seconds to hh-mm-ss format.
* @param {number} totalSeconds - the total seconds to convert to hh- mm-ss
**/
var SecondsTohhmmss = function(totalSeconds) {
var hours = Math.floor(totalSeconds / 3600);
var minutes = Math.floor((totalSeconds - (hours * 3600)) / 60);
var seconds = totalSeconds - (hours * 3600) - (minutes * 60);
// round seconds
seconds = Math.round(seconds * 100) / 100
var result = (hours < 10 ? "0" + hours : hours);
result += "-" + (minutes < 10 ? "0" + minutes : minutes);
result += "-" + (seconds < 10 ? "0" + seconds : seconds);
return result;
}
Пример использования
var seconds = SecondsTohhmmss(70);
console.log(seconds);
// logs 00-01-10
Посмотрев на все ответы и не обрадовавшись большинству из них, я пришел к этому. Я знаю, что я очень поздно к разговору, но здесь это все равно.
function secsToTime(secs){
var time = new Date();
// create Date object and set to today's date and time
time.setHours(parseInt(secs/3600) % 24);
time.setMinutes(parseInt(secs/60) % 60);
time.setSeconds(parseInt(secs%60));
time = time.toTimeString().split(" ")[0];
// time.toString() = "HH:mm:ss GMT-0800 (PST)"
// time.toString().split(" ") = ["HH:mm:ss", "GMT-0800", "(PST)"]
// time.toTimeString().split(" ")[0]; = "HH:mm:ss"
return time;
}
Я создаю новый объект Date, изменяю время на мои параметры, преобразовываю объект Date в строку времени и удаляю дополнительные элементы, разбивая строку и возвращая только ту часть, которая требуется.
Я думал, что поделюсь этим подходом, так как он устраняет необходимость в регулярных выражениях, логике и математической акробатике для получения результатов в формате «ЧЧ: мм: сс», и вместо этого он опирается на встроенные методы.
Вы можете ознакомиться с документацией здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Есть много вариантов решения этой проблемы, и очевидно, что есть хороший вариант, но я хочу добавить еще один оптимизированный код здесь
function formatSeconds(sec) {
return [(sec / 3600), ((sec % 3600) / 60), ((sec % 3600) % 60)]
.map(v => v < 10 ? "0" + parseInt(v) : parseInt(v))
.filter((i, j) => i !== "00" || j > 0)
.join(":");
}
если вы не хотите форматировать ноль с числом меньше 10, вы можете использовать
function formatSeconds(sec) {
return parseInt(sec / 3600) + ':' + parseInt((sec % 3600) / 60) + ':' + parseInt((sec % 3600) % 60);
}
Пример кода http://fiddly.org/1c476/1
В одной строке, используя решение TJ Crowder:
secToHHMMSS = seconds => `${Math.floor(seconds / 3600)}:${Math.floor((seconds % 3600) / 60)}:${Math.floor((seconds % 3600) % 60)}`
В одной строке другое решение, которое также считает дни:
secToDHHMMSS = seconds => `${parseInt(seconds / 86400)}d ${new Date(seconds * 1000).toISOString().substr(11, 8)}`
Источник: https://gist.github.com/martinbean/2bf88c446be8048814cf02b2641ba276
Вы также можете использовать следующий код:
int ss = nDur%60;
nDur = nDur/60;
int mm = nDur%60;
int hh = nDur/60;
new Date().toString().split(" ")[4];
результат 15:08:03
Для любого, кто использует AngularJS, простое решение - отфильтровать значение с помощью API даты , который преобразует миллисекунды в строку на основе запрошенного формата. Пример:
<div>Offer ends in {{ timeRemaining | date: 'HH:mm:ss' }}</div>
Обратите внимание, что для этого требуются миллисекунды, поэтому вы можете захотеть умножить timeRemaining на 1000, если вы конвертируете из секунд (как был сформулирован исходный вопрос).
Я столкнулся с случаем, когда некоторые упоминали, что количество секунд больше дня. Вот адаптированная версия ответа @Harish Anchu с самым высоким рейтингом, который учитывает более длительные периоды времени:
function secondsToTime(seconds) {
const arr = new Date(seconds * 1000).toISOString().substr(11, 8).split(':');
const days = Math.floor(seconds / 86400);
arr[0] = parseInt(arr[0], 10) + days * 24;
return arr.join(':');
}
Пример:
secondsToTime(101596) // outputs '28:13:16' as opposed to '04:13:16'
String.prototype.toHHMMSS = function () {
var sec_num = parseInt(this, 10); // don't forget the second param
var hours = Math.floor(sec_num / 3600);
var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
var seconds = sec_num - (hours * 3600) - (minutes * 60);
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
return hours+':'+minutes+':'+seconds;
}
Пример использования
alert("186".toHHMMSS());
Ни один из ответов здесь не удовлетворяет моим требованиям, так как я хочу быть в состоянии справиться
Несмотря на то, что они не требуются ФП, эффективная практика заключается в том, чтобы охватить крайние случаи, особенно когда это требует небольших усилий.
Совершенно очевидно, что ОП означает НЕСКОЛЬКО секунд, когда он говорит секунды . Зачем привязывать вашу функцию String
?
function secondsToTimeSpan(seconds) {
const value = Math.abs(seconds);
const days = Math.floor(value / 1440);
const hours = Math.floor((value - (days * 1440)) / 3600);
const min = Math.floor((value - (days * 1440) - (hours * 3600)) / 60);
const sec = value - (days * 1440) - (hours * 3600) - (min * 60);
return `${seconds < 0 ? '-':''}${days > 0 ? days + '.':''}${hours < 10 ? '0' + hours:hours}:${min < 10 ? '0' + min:min}:${sec < 10 ? '0' + sec:sec}`
}
secondsToTimeSpan(0); // => 00:00:00
secondsToTimeSpan(1); // => 00:00:01
secondsToTimeSpan(1440); // => 1.00:00:00
secondsToTimeSpan(-1440); // => -1.00:00:00
secondsToTimeSpan(-1); // => -00:00:01
secondsToTimeSpan(8991)
возвращается, 6.00:05:51
тогда как я думаю, что это должно вернуться00:02:29:51
Я использовал этот код раньше, чтобы создать простой объект timepan:
function TimeSpan(time) {
this.hours = 0;
this.minutes = 0;
this.seconds = 0;
while(time >= 3600)
{
this.hours++;
time -= 3600;
}
while(time >= 60)
{
this.minutes++;
time -= 60;
}
this.seconds = time;
}
var timespan = new Timespan(3662);