Comment convertir les secondes en HH: mm: ss dans moment.js


93

Comment puis-je convertir les secondes en HH:mm:ss ?

En ce moment, j'utilise la fonction ci-dessous

render: function (data){
     return new Date(data*1000).toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");;
}

Cela fonctionne sur Chrome, mais dans Firefox pendant 12 secondes, 01:00:12 je voudrais utiliser moment.js pour la compatibilité entre navigateurs

J'ai essayé mais ne fonctionne pas

render: function (data){
         return moment(data).format('HH:mm:ss');
}

Qu'est-ce que je fais mal?

ÉDITER

J'ai réussi à trouver une solution sans moment.js qui est la suivante

return (new Date(data * 1000)).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0];

Toujours curieux de savoir comment je peux le faire dans moment.js



@mplungjan Désolé de ne pas avoir mentionné que j'ai déjà lu ce post. J'ai besoin de rendre un tableau avec des millions de lignes et la solution est trop lente. la deuxième réponse est exactement ce que j'ai écrit dans ma question mais me donne des problèmes dans firefox
QGA

2
@QuentinTanioartino donc 4 opérateurs mathématiques triviaux est un problème pour la tâche de mutation du DOM pour des millions d'éléments? Êtes-vous sûr de bien comprendre le problème de performances?
zerkms

@zerkms et bien je sais que mes classes DAO doivent être réécrites pour servir les données déjà converties. C'est un problème dont je suis conscient. Dit que je suis assez content des performances actuelles de ma première tentative mais quand j'ai 5 opérations mathématiques pour une conversion qui ralentit un peu le système. Oui, je suis d'accord avec vous que ce n'est qu'une solution
temporaire

@QuentinTanioartino "qui ralentit un peu le système" --- "un peu" n'est pas ainsi que vous raisonnez sur les performances. Est-ce un goulot d'étranglement? Est - il prouvé être un goulot d' étranglement? Sinon, qu'est-ce qui vous pousse à optimiser cette opération même?
zerkms

Réponses:


79

À partir de cet article , j'essaierais ceci pour éviter les problèmes de saut

moment("2015-01-01").startOf('day')
    .seconds(s)
    .format('H:mm:ss');

Je n'ai pas exécuté jsPerf, mais je pense que c'est plus rapide que de créer de nouveaux objets de date un million de fois

function pad(num) {
    return ("0"+num).slice(-2);
}
function hhmmss(secs) {
  var minutes = Math.floor(secs / 60);
  secs = secs%60;
  var hours = Math.floor(minutes/60)
  minutes = minutes%60;
  return `${pad(hours)}:${pad(minutes)}:${pad(secs)}`;
  // return pad(hours)+":"+pad(minutes)+":"+pad(secs); for old browsers
}


2
Merci beaucoup, solution très intelligente
QGA

1
Le second, c'est extrêmement rapide
QGA

1
Vous pouvez le faire dans le deuxième exemple: return [heures, minutes, secondes] .filter (t => t) .map (pad) .join (":")
Onno Faber

@OnnoFaber Selon vous, quel est le plus rapide? concaténation ou un filtre plus une carte? Nous pourrions aussi faire`${pad(hours)}:${pad(minutes)}:${pad(secs)}`
mplungjan

De toutes les réponses précédentes, la plus simple est celle de mplungjan , mais elle a une erreur qui montre des nombres aléatoires si la valeur a des millisecondes (par exemple: 17,3 s). Basé sur son code, je propose ce qui suit: function pad (num) {return ("0" + num) .slice (-2); } / ** * @return {chaîne} * / fonction d'exportation par défaut renderUserTime (secondes) {let minutes = Math.floor (secondes / 60); const outputSecs = Math.round (secondes% 60); laissez heures = Math.floor (minutes / 60); const outputMinutes = Math.round (minutes% 60); return `$ {pad (hours)}: $ {pad (outputMi
Alberto Soto

94

Ceci est similaire à la réponse mplungjan référencée dans un autre article, mais plus concis:

const secs = 456;

const formatted = moment.utc(secs*1000).format('HH:mm:ss');

document.write(formatted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Il souffre des mêmes mises en garde, par exemple si les secondes dépassent un jour (86400), vous n'obtiendrez pas ce que vous attendez.


1
merci, je pense que c'est un besoin très courant, ouvrez une pull request à moment.js ils devraient l'intégrer.
Morris S

Merci @Sophie. Peu d'endroits mentionnent utc (), ce qui est exactement ce qu'il fallait dans mon cas.
pmont

24

Vous pouvez utiliser le plugin au format moment-durée :

var seconds = 3820;
var duration = moment.duration(seconds, 'seconds');
var formatted = duration.format("hh:mm:ss");
console.log(formatted); // 01:03:40
<!-- Moment.js library -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

<!-- moment-duration-format plugin -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/1.3.0/moment-duration-format.min.js"></script>

Voir aussi ce violon

Mise à jour: pour éviter le découpage des valeurs inférieures à 60 secondes, utilisez { trim: false }:

var formatted = duration.format("hh:mm:ss", { trim: false }); // "00:00:05"

Il y a un compromis qui doit être examiné avec votre réponse et la réponse de @ sophie. Alors que techniquement votre solution affichera une durée de "Time" sous la forme hh: mm: ss, elle nécessite le plugin supplémentaire. Sophie est une "Date" à partir du moment actuel formaté en hh: mm: ss. Si vous supprimez le "utc" de Sophie, il pourrait renvoyer des informations incorrectes car il utilise l'époque comme date et non comme point actuel dans le temps. Les deux réponses fonctionnent. Juste quelque chose à penser et à comprendre.
Michael

Bien qu'ici, l'utilisation du CDN et autres puisse ajouter une latence accrue, il est généralement dangereux de penser à "inclure une autre bibliothèque" comme un compromis négatif par rapport à l'implémentation du code vous-même. C'est un piège dans lequel de nombreux développeurs tombent et finissent par se retrouver avec un code moins maintenable.
cytinus

pour une raison quelconque, si secondes <60, il se termine simplement non formaté
Daniel Lizik

@DanielLizik, ajoutez simplement {trim: false}. Par exemple: duration.format ("hh: mm: ss", {trim: false});
Oleksiy Kachynskyy

16
var seconds = 2000 ; // or "2000"
seconds = parseInt(seconds) //because moment js dont know to handle number in string format
var format =  Math.floor(moment.duration(seconds,'seconds').asHours()) + ':' + moment.duration(seconds,'seconds').minutes() + ':' + moment.duration(seconds,'seconds').seconds();

1

Comment utiliser correctement les durées moment.js? | Utilisez moment.duration () dans les codes

Tout d'abord, vous devez importer momentet moment-duration-format.

import moment from 'moment';
import 'moment-duration-format';

Ensuite, utilisez la fonction de durée. Appliquons l'exemple ci-dessus: 28800 = 8 heures du matin.

moment.duration(28800, "seconds").format("h:mm a");

🎉Eh bien, vous n'avez pas d'erreur de type ci-dessus. 🤔Avez-vous une bonne valeur à 8h00? Non…, la valeur que vous obtenez est 8:00 a. Le format Moment.js ne fonctionne pas comme il le devrait.

💡 La solution consiste à transformer les secondes en millisecondes et à utiliser l'heure UTC.

moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a')

Très bien, nous obtenons 8h00 maintenant. Si vous voulez 8 heures du matin au lieu de 8 heures pour le temps intégral, nous devons faire RegExp

const time = moment.utc(moment.duration(value, 'seconds').asMilliseconds()).format('h:mm a');
time.replace(/:00/g, '')

1

Jusqu'à 24 heures. Tel que Duration.formatdéconseillé, avec moment@2.23.0

const seconds = 123;
moment.utc(moment.duration(seconds,'seconds').as('milliseconds')).format('HH:mm:ss');
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.