Comment puis-je convertir des secondes en une HH-MM-SS
chaîne en utilisant JavaScript?
Comment puis-je convertir des secondes en une HH-MM-SS
chaîne en utilisant JavaScript?
Réponses:
Vous ne connaissez pas datejs ? c'est un must.
En utilisant datejs, écrivez simplement quelque chose comme:
(new Date).clearTime()
.addSeconds(15457)
.toString('H:mm:ss');
--mettre à jour
De nos jours, date.js est obsolète et n'est pas maintenu, alors utilisez " Moment.js ", ce qui est beaucoup mieux comme l'a souligné TJ Crowder.
--mise à jour 2
Veuillez utiliser @ Frank's une solution à une ligne:
new Date(SECONDS * 1000).toISOString().substr(11, 8)
C'est de loin la meilleure solution.
TypeError: Object [object Date] has no method 'clearTime'
.
Vous pouvez réussir à le faire sans aucune bibliothèque JavaScript externe à l'aide de la méthode JavaScript Date, comme suit:
var date = new Date(null);
date.setSeconds(SECONDS); // specify value for SECONDS here
var result = date.toISOString().substr(11, 8);
Ou, selon le commentaire de @Frank ; une doublure:
new Date(SECONDS * 1000).toISOString().substr(11, 8);
new Date(SECONDS * 1000).toISOString().substr(11, 8);
Object doesn't support property or method 'toISOString'
Je ne pense pas qu'une fonctionnalité intégrée de l'objet Date standard le fasse pour vous d'une manière plus pratique que de faire les calculs vous-même.
hours = Math.floor(totalSeconds / 3600);
totalSeconds %= 3600;
minutes = Math.floor(totalSeconds / 60);
seconds = totalSeconds % 60;
Exemple:
0.05
dans la hours
variable. Je l'ai mis à l'intérieur d'un parseInt
qui l'a fixé pour mon cas, mais je ne pense pas que ce serait exact pour tout. Pourtant, cela m'a aidé, alors merci!
parseInt
, c'est pour analyser des chaînes , pas pour manipuler des nombres. Math.floor
serait l'opération pertinente ici.
seconds = Math.floor(totalSeconds % 60);
. J'ai aussi obtenu un résultat décimal.
totalSeconds % 60
ne peut avoir qu'une partie fractionnaire s'il totalSeconds
a une partie fractionnaire. Que vous souhaitiez le plancher, cela dépendra de la perte ou de la conservation de ces informations. (Les autres opérations d'étage que nous effectuons ne perdent aucune information, car elles effacent simplement les données qui se retrouveront dans minutes
et seconds
.)
console.log( hours +':'+ ('0'+minutes).slice(-2) +':'+ ('0'+seconds).slice(-2) );
Je sais que c'est un peu vieux, mais ...
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(":")
}
Il produira:
toHHMMSS(129600) // 36:00:00
toHHMMSS(13545) // 03:45:45
toHHMMSS(180) // 03:00
toHHMMSS(18) // 00:18
Comme Cleiton l'a souligné dans sa réponse , moment.js peut être utilisé pour cela:
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"
nous pouvons rendre cette fonction beaucoup plus courte et nette mais cela diminue la lisibilité, nous l'écrirons donc aussi simple que possible et aussi stable que possible.
ou vous pouvez vérifier que cela fonctionne ici :
Voici une extension de la classe Number. toHHMMSS () convertit les secondes en une chaîne hh: mm: ss.
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>
Version facile à suivre pour les noobies:
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);
Cette fonction devrait le faire:
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 : ':' );
}
Sans passer de séparateur, il utilise :
comme séparateur (par défaut):
time = convertTime(13551.9941351); // --> OUTPUT = 03:45:51
Si vous souhaitez utiliser -
comme séparateur, passez-le simplement comme deuxième paramètre:
time = convertTime(1126.5135155, '-'); // --> OUTPUT = 00-18-46
Voir aussi ce violon .
:
par défaut pour le separator
paramètre, comme je l'ai déjà expliqué. Cela se fait par la déclaration typeof separator !== 'undefined' ? separator : ':'
. De plus, votre fonction est à peu près identique à la mienne sauf quelques modifications cosmétiques et elles devraient toutes deux produire la même sortie ... sauf que ma version a un bien meilleur support du navigateur. Le vôtre ne fonctionnera dans AUCUNE version d'Internet Explorer ou de MS Edge <14.
ci-dessous est le code donné qui convertira les secondes au format hh-mm-ss:
var measuredTime = new Date(null);
measuredTime.setSeconds(4995); // specify value of SECONDS
var MHSTime = measuredTime.toISOString().substr(11, 8);
Obtenir une méthode alternative de Convertir les secondes au format HH-MM-SS en JavaScript
Pour le cas particulier de HH: MM: SS.MS (eq: "00: 04: 33.637") tel qu'utilisé par FFMPEG pour spécifier les millisecondes .
[-] [HH:] MM: SS [.m ...]
HH exprime le nombre d'heures, MM le nombre de minutes pour un maximum de 2 chiffres et SS le nombre de secondes pour un maximum de 2 chiffres. Le m à la fin exprime la valeur décimale pour SS.
/* 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)
)
Exemple d'utilisation, une minuterie de transport en millisecondes:
/* 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>
Exemple d'utilisation, lié à un élément multimédia
/* 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>
En dehors de la question, ces fonctions écrites en 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()
en utilisant simplement 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.
}
}
Je voulais juste donner une petite explication à la belle réponse ci-dessus:
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);
Sur la deuxième ligne, comme il y a 3600 secondes en 1 heure, nous divisons le nombre total de secondes par 3600 pour obtenir le nombre total d'heures. Nous utilisons parseInt pour supprimer toute décimale. Si totalSec était de 12600 (3 heures et demie), alors parseInt (totalSec / 3600) renverrait 3, car nous aurons 3 heures complètes. Pourquoi avons-nous besoin du% 24 dans ce cas? Si nous dépassons 24 heures, disons que nous avons 25 heures (90000 secondes), alors le modulo ici nous ramènera à 1, plutôt que de revenir à 25. Il limite le résultat dans une limite de 24 heures, car il y a 24 heures en un jour.
Lorsque vous voyez quelque chose comme ça:
25 % 24
Pensez-y comme ceci:
25 mod 24 or what is the remainder when we divide 25 by 24
Sonner sur ce vieux fil - l'OP a déclaré HH: MM: SS, et de nombreuses solutions fonctionnent, jusqu'à ce que vous réalisiez que vous avez besoin de plus de 24 heures répertoriées. Et peut-être que vous ne voulez pas plus d'une seule ligne de code. Voici:
d=(s)=>{f=Math.floor;g=(n)=>('00'+n).slice(-2);return f(s/3600)+':'+g(f(s/60)%60)+':'+g(s%60)}
Il renvoie H +: MM: SS. Pour l'utiliser, utilisez simplement:
d(91260); // returns "25:21:00"
d(960); // returns "0:16:00"
... J'ai essayé de le faire utiliser le moins de code possible, pour une belle approche à une ligne.
Avez-vous essayé d'ajouter des secondes à un objet Date?
var dt = new Date();
dt.addSeconds(1234);
Un exemple: https://jsfiddle.net/j5g2p0dc/5/
Mise à jour: un exemple de lien manquait, j'en ai créé un nouveau.
addSeconds
sur un objet Date comme Date.prototype.addSeconds = function(seconds){...}
. Oui, cela fonctionne, merci pour la mise à jour.
Voici une fonction pour convertir les secondes au format hh-mm-ss basé sur la réponse de powtac ici
/**
* 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;
}
Exemple d'utilisation
var seconds = SecondsTohhmmss(70);
console.log(seconds);
// logs 00-01-10
Après avoir regardé toutes les réponses et ne pas être satisfait de la plupart d'entre elles, voici ce que j'ai trouvé. Je sais que je suis très en retard pour la conversation, mais la voici quand même.
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;
}
Je crée un nouvel objet Date, modifie l'heure à mes paramètres, convertis l'objet Date en une chaîne d'heure et supprime les éléments supplémentaires en divisant la chaîne et en ne renvoyant que la partie qui en a besoin.
J'ai pensé partager cette approche, car elle supprime le besoin d'acrobaties d'expression rationnelle, de logique et de mathématiques pour obtenir les résultats au format "HH: mm: ss", et à la place, elle s'appuie sur des méthodes intégrées.
Vous pouvez consulter la documentation ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Il existe de nombreuses options pour résoudre ce problème, et il est évident qu'il existe une bonne option suggérée, mais je veux ajouter un code optimisé de plus ici
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(":");
}
si vous ne voulez pas mettre en forme zéro avec moins de 10 nombres, vous pouvez utiliser
function formatSeconds(sec) {
return parseInt(sec / 3600) + ':' + parseInt((sec % 3600) / 60) + ':' + parseInt((sec % 3600) % 60);
}
Exemple de code http://fiddly.org/1c476/1
En une seule ligne, en utilisant la solution de TJ Crowder:
secToHHMMSS = seconds => `${Math.floor(seconds / 3600)}:${Math.floor((seconds % 3600) / 60)}:${Math.floor((seconds % 3600) % 60)}`
En une ligne, une autre solution qui compte également des jours:
secToDHHMMSS = seconds => `${parseInt(seconds / 86400)}d ${new Date(seconds * 1000).toISOString().substr(11, 8)}`
Source: https://gist.github.com/martinbean/2bf88c446be8048814cf02b2641ba276
Vous pouvez également utiliser le code ci-dessous:
int ss = nDur%60;
nDur = nDur/60;
int mm = nDur%60;
int hh = nDur/60;
new Date().toString().split(" ")[4];
résultat 15:08:03
Pour toute personne utilisant AngularJS, une solution simple consiste à filtrer la valeur avec l' API date , qui convertit les millisecondes en une chaîne basée sur le format demandé. Exemple:
<div>Offer ends in {{ timeRemaining | date: 'HH:mm:ss' }}</div>
Notez que cela attend des millisecondes, vous pouvez donc vouloir multiplier timeRemaining par 1000 si vous effectuez une conversion à partir de secondes (comme la question d'origine a été formulée).
Je suis tombé sur le cas que certains ont mentionné où le nombre de secondes est supérieur à un jour. Voici une version adaptée de la réponse la mieux notée de @Harish Anchu qui tient compte de périodes plus longues:
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(':');
}
Exemple:
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;
}
Exemple d'utilisation
alert("186".toHHMMSS());
Aucune des réponses ici ne répond à mes exigences car je veux pouvoir gérer
Bien que ceux-ci ne soient pas requis par l'OP, il est recommandé de couvrir les cas de bord, surtout quand cela prend peu d'effort.
Il est assez évident que l'OP signifie un NOMBRE de secondes quand il dit secondes . Pourquoi ancreriez-vous votre fonction 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)
renvoie 6.00:05:51
alors que je pense qu'il devrait revenir00:02:29:51
J'ai déjà utilisé ce code pour créer un simple objet de durée:
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);