2015-11-02 1 views
2

Permettez-moi préfacer en disant que j'ai une solution « de travail », pris en partie à ce sujet précédent:Localize « durée » ou « temps restant » de millisecondes

How to convert time milliseconds to hours, min, sec format in JavaScript?

Mon objectif est de prendre une durée en millisecondes et de la convertir en lisible par l'homme, en utilisant des technologies de localisation/internationalisation. La valeur d'entrée est en millisecondes et est une cible mobile car il s'agit d'une heure d'arrivée estimée (ETA) plutôt que d'une heure d'arrivée ferme. Il est constamment recalculé.

Ce que j'ai imaginé fonctionne. Ce que je cherche est quelque chose qui pourrait tirer parti de (parce qu'il a déjà un système de localisation). Il ne doit pas être en particulier, mais je veux quelque chose qui a des options plus élégantes, en particulier lorsqu'il s'agit de localisation. J'utilise également et donc avoir accès à tout ce qui est fourni par .

Voici une version réduite de la solution actuelle (il est à l'intérieur d'un objet littéral des fonctions utilitaires):

function duration (millis) { 
 
    // in actual code, a function "i18n.t(key)" would return a properly 
 
    // localized string. Instead, I'll just store English strings in an object 
 
    var mockTranslation = { 
 
    hoursLabel: "hr", 
 
    minutesLabel: "min", 
 
    secondsLabel: "s" 
 
    } 
 

 
    millis = parseInt(millis); 
 

 
    function msToTime(duration) { 
 
    var milliseconds = parseInt((duration%1000)/100) 
 
     , seconds = parseInt((duration/1000)%60) 
 
     , minutes = parseInt((duration/(1000*60))%60) 
 
     , hours = parseInt((duration/(1000*60*60))%24); 
 

 
    hours = (hours < 10) ? "0" + hours : hours; 
 
    minutes = (minutes < 10) ? "0" + minutes : minutes; 
 
    seconds = (seconds < 10) ? "0" + seconds : seconds; 
 

 
    return { 
 
     hours : hours, 
 
     minutes: minutes, 
 
     seconds: seconds, 
 
     milliseconds: milliseconds 
 
    } 
 
    } 
 
    var converted = msToTime(millis); 
 
    var final = "" + converted.hours + " " + mockTranslation.hoursLabel 
 
      + " " + converted.minutes + " " + mockTranslation.minutesLabel 
 
      + " " + converted.seconds + " " + mockTranslation.secondsLabel; 
 
    return final; 
 
} 
 

 
// test with a sample input of 416000 ms. 
 
console.log(duration(416000)); // 00 hr 06 min 56 s

Dans ce cas, je prends une approche similaire à celle du fil d'origine, mais Je retourne un objet utilisable au lieu de convertir automatiquement en une chaîne. Dans mon code réel, j'ai d'autres conditions que je traverse et certaines options qui retourneront une valeur qui n'est pas localisée. Mais ici nous voyons que je prends l'objet et le concatène avec quelques entrées de langue fournies par . C'est là que la localisation se produit.

Pourtant, il me semble que les durées de temps ont plus pour eux que d'échanger des unités de mesure. L'utilisation de semble être trop lourde, mais malgré cela, je ne vois aucune fonction de durée. Toutes les fonctions liées à la date.

Puisqu'il me semble que ma solution n'est pas très flexible et que la localisation est quelque peu secondaire, quelqu'un connaît-il une meilleure approche?

+0

Je ne sais pas comment communiquer de nouveau aux éditeurs autres que par les commentaires ... mais cet extrait ne produit pas réellement le nécessaire sortie. L'intention avait à voir avec la localisation qui est maintenant complètement manquante. Si l'un des éditeurs "approuvant" autre que celui qui rejette jamais lu ceci ... vous avez échoué dans votre travail, aussi.;) –

+0

Note: "cet extrait" auquel j'ai fait allusion dans mon commentaire précédent était celui fourni à l'origine par un éditeur. Je l'ai depuis mis à jour. –

Répondre

4

Il y a une possibilité d'afficher la durée en millisecondes utilisant moment.js de manière lisible:

moment.duration(416000).humanize(); 

Les retours de code ci-dessus: 7 minutes. Est-ce ce dont vous avez besoin?

Bien sûr, vous pouvez utiliser i18n depuis moment.js. Vous avez juste besoin d'appeler:

moment.locale('es'); 
moment.duration(416000).humanize(); 

pour obtenir la durée dans la localisation espagnole (7 minutos).

Si vous avez besoin des résultats plus détaillés (6 minutes 56 seconds) un coup d'oeil à cette bibliothèque: https://github.com/EvanHahn/HumanizeDuration.js

+0

Merci Marek! Oui, c'est exactement ce que je cherchais. J'ai lu les docs du moment, mais d'une manière ou d'une autre j'ai échoué à trébucher sur la durée ou à humaniser ...: - Plus important encore, je crois que j'ai besoin de la granularité de HumanizeDuration.js je dois donc vous remercier de m'indiquer dans cette direction. –