Je sais que je peux faire n'importe quoi et quelques dates plus envoûtantes avec momentjs. Mais embarrassant, j'ai du mal à essayer de faire quelque chose qui semble simple: faire la différence entre 2 fois.
Exemple:
var now = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";
//expected result:
"00:39:30"
ce que j'ai essayé:
var now = moment("04/09/2013 15:00:00");
var then = moment("04/09/2013 14:20:30");
console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30
Je ne comprends pas ce que c'est que "10" là-bas. J'habite au Brésil, nous sommes donc utc-0300 si cela est pertinent.
Le résultat de moment.duration(now.diff(then))
est une durée avec les valeurs internes correctes:
days: 0
hours: 0
milliseconds: 0
minutes: 39
months: 0
seconds: 30
years: 0
Donc, je suppose que ma question est: comment convertir une durée momentjs en un intervalle de temps? Je peux certainement utiliser
duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")
mais je sens qu'il y a quelque chose de plus élégant qui me manque complètement.
mise
à jour en regardant de plus près, dans l'exemple ci-dessus now
est:
Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}
et moment(moment.duration(now.diff(then)))
c'est:
Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}
Je ne sais pas pourquoi la deuxième valeur est en heure d'été (-0200) ... mais je suis sûr que je n'aime pas les dates :(
mise à jour 2
eh bien, la valeur est -0200 probablement parce que le 31/12/1969 était une date où l'heure d'été était utilisée ... c'est donc ça.
Réponses:
Cette approche fonctionnera UNIQUEMENT lorsque la durée totale est inférieure à 24 heures:
Si vous avez 24 heures ou plus, les heures seront remises à zéro avec l'approche ci-dessus, donc ce n'est pas idéal.
Si vous souhaitez obtenir une réponse valide pour des durées de 24 heures ou plus, vous devrez alors faire quelque chose comme ceci:
Notez que j'utilise le temps utc comme raccourci. Vous pourriez vous retirer
d.minutes()
etd.seconds()
séparer, mais vous devrez également les zéros.Cela est nécessaire car la possibilité de formater une
duration
objection n'est pas actuellement dans moment.js. Il a été demandé ici . Cependant, il existe un plugin tiers appelé moment-duration-format qui est spécifiquement conçu à cet effet:la source
Votre problème consiste à transmettre le résultat de moment.duration () à moment () avant de le formater; il en résulte que moment () l'interprète comme un temps par rapport à l'époque Unix.
Il ne vous donne pas exactement le format que vous recherchez, mais
moment.duration(now.diff(then)).humanize()
vous donnerait un format utile comme "40 minutes". Si vous aimez vraiment cette mise en forme spécifique, vous devrez créer vous-même une nouvelle chaîne. Un moyen bon marché serait
[diff.asHours(), diff.minutes(), diff.seconds()].join(':')
où
var diff = moment.duration(now.diff(then))
. Cela ne vous donne pas le zéro pour les valeurs à un chiffre. Pour cela, vous voudrez peut-être envisager quelque chose comme underscore.string - bien que cela semble être un long chemin à parcourir juste pour quelques zéros supplémentaires. :)la source
asHours
au lieu dehours
et retirer les décimales. Sinon, il y aurait le même problème que vous avez attrapé dans ma réponse. :)[Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')
afin d'obtenir le résultat souhaité. sans décimale dans la première partieTravaillé pour moi
Voir plus dans http://momentjs.com/docs/#/displaying/difference/
la source
Si vous voulez une différence de deux horodatages en jours, heures et minutes uniquement, pas en mois ni en années.
diff contient 2 mois, 23 jours, 23 heures et 20 minutes. Mais nous avons besoin de résultats uniquement en jours, heures et minutes, donc la solution simple est:
Le résultat final sera: 84 jours, 23 heures, 20 minutes.
la source
Lorsque vous appelez
diff
, moment.js calcule la différence en millisecondes. Si les millisecondes sont passées àduration
, il est utilisé pour calculer la durée qui est correcte. Toutefois. lorsque vous passez les mêmes millisecondes aumoment()
, il calcule la date qui est en millisecondes à partir de (après) l'heure epoch / unix qui est le 1er janvier 1970 (minuit UTC / GMT). C'est pourquoi vous obtenez 1969 comme l'année avec la mauvaise heure.Donc, je pense que c'est comme ça que vous devriez le faire car moment.js n'offre pas de
format
fonction pour la durée. Ou vous pouvez écrire un simple wrapper pour le rendre plus facile / plus joli.la source
Cela devrait bien fonctionner.
la source
Si nous voulons seulement hh: mm: ss, nous pouvons utiliser une fonction comme celle-ci:
la source
Utilisez ceci,
la source
Au lieu de
Il vaut mieux faire
la source
Dans ES8, utilisez moment, now et commencez à être des objets moment.
la source
Typographie: ce qui suit devrait fonctionner,
la source
Je crée une fonction simple avec tapuscrit
pour générer javascript https://www.typescriptlang.org/play/index.html
la source
InTime = 06: 38, Outtime = 15: 40
la source
ENTRÉE BASÉE SUR L'HEURE ET LA DATE
PRODUCTION
la source
DIFFÉRENCE DE TEMPS EPOCH À L'AIDE DE MOMENTJS :
Pour obtenir la différence entre deux époques:
Syntaxe:
moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()
Différence d'heures:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()
Différence en minutes:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()
Remarque: Vous pouvez supprimer
.toFixed()
si vous avez besoin de valeurs précises.Code:
Reportez-vous à l'exemple de travail ici: https://repl.it/repls/MoccasinDearDimension
la source