7
votes

gethours () retourner une valeur incorrecte

J'utilise l'objet de date JavaScript pour convertir des millisecondes en un lisible: minutes: secondes chaîne formatée. J'ai besoin de cela pour créer une minuterie pour un lecteur vidéo personnalisé, où mon interface JS reçoit les informations de la durée vidéo en tant que valeur milliseconde.

Ce fut une tâche assez triviale, avant de décider de soutenir une possibilité d'avoir une vidéo de plus de 59 minutes. Et puis j'ai rencontré ce problème: lorsque je soumets une valeur de milliseconde au constructeur de l'objet de la nouvelle date, puis appelle gethours () , il retournera quelque chose même si le nombre de millisecondes représente une période de temps moins d'une heure. Le moyen le plus simple de voir cela en action est de le nourrir, par exemple, 0.

Entrez la description de l'image ici

Je m'attendrais à ce qu'il retourne 0, mais il retourne toujours 12 (13 dans l'opéra, ce qui le rend encore plus étrange). Est-ce un comportement normal ou s'agit-il d'un bug? De toute façon, comment détecter de manière fiable si ma valeur de millisecond est limitée à quelques minutes et secondes ou inclut également des heures?

Merci.

UPD:

Je l'ai testé à Chrome 15 et Firefox 7 sur OSX: même résultat que la capture d'écran ci-dessus. Je ne peux pas comprendre comment utiliser la console de libellule d'opéra, mais d'après ce que je vois la même chose se passe dans l'opéra, juste avec la valeur de 13 pour gethours () . .


6 commentaires

Vous ne voulez pas utiliser la date Constructeur ici. Nouvelle date (n) renvoie une date objet avec la date définie au 1er janvier 1970 + n millisecondes, ce qui n'est certainement pas ce que vous voulez. ..


@ Šimevidas, alors quelle serait une bonne alternative?


Vous allez ici: jsfiddle.net/x5HN5/1


@ Šimevidas, c'est génial, simple et fiable. Merci!


@ Šimevidas, j'ai étendu et amélioré votre fonction, au cas où vous seriez intéressé: jsfiddle.net/j9zna/1


Je l'ai refoutue un peu ... jsfiddle.net/j9zna/2


4 Réponses :


7
votes

essayez d'appeler nouvelle date (0) .tostring () code> et voyez s'il y a un fuseau horaire qui l'affecte?

mine donne p>

var toTimeString = function( secs ) {
var days, hours, minutes, seconds;

    if( secs == null )
    return "";

days = ( secs / 86400 ) >> 0;
hours = ( secs % 86400 / 3600 ) >> 0;
minutes = ( secs % 3600 / 60 ) >> 0;
seconds = ( secs % 60 );    
seconds = seconds < 10 ? "0" + seconds : seconds;
minutes = minutes < 10 ? "0" + minutes : minutes;
hours = hours && hours < 10 ? "0" + hours : hours;

return "" + ( days ? days+" - " : "" ) + ( hours ? hours+":" : "" ) + minutes + ":" + seconds;      
};


1 commentaires

Droite, Timezone. Je suis en Nouvelle-Zélande, c'est pourquoi, dans mon cas, il ajoute 12 heures à 0. Je n'aurais jamais pensé à cela, merci beaucoup! Bien que cela ne résout pas le problème, cela montre simplement à quel point cette approche est peu fiable ...



0
votes

Essayez de spécifier l'année, le mois, la journée, les minutes, les minutes, les secondes et les millisecondes à la place:

var sampleTime = new Date(1900,1,1,0,0,0,0);


2 commentaires

Ce serait le 1er février 1900. Les mois sont basés sur zéro, par exemple janvier, c'est mois 0 .


@ gilly3 bon point, j'ai oublié ça. En tout cas, la date est quelque peu arbitraire. C'est le moment qui est important dans ce cas.



2
votes

Je sais que vous ne demandez pas cela, et c'est ennuyeux d'obtenir des réponses qui ne répondent pas à votre question, mais dans ce cas, je vous recommande sérieusement de passer à Datejs avant de faire beaucoup de nouilles de travail avec L'objet Date natif de JS () qui n'est pas trop puissant et peut être une source de nombreux problèmes, surtout si vous devez normaliser les fuseaux horaires! http://www.datejs.com/


0 commentaires

29
votes

Je remarque que, si les gens ont informé l'utilisateur sur la manière de réparer son code, ils ne l'ont pas informé sur la façon de faire ce qu'il a demandé. La réponse est plutôt simple. N'utilisez pas la fonction gethours (). Utilisez UTILISER UESTUCHOURS (). Cela contournera tout délicat traizone.

Vous aurez toujours des problèmes si vous avez déjà besoin de monter jusqu'à JOURS, mais de jusque-là, la primitive de date fonctionnera parfaitement pour ce que vous l'utilisez.


3 commentaires

Merci pour cela, vous avez corrigé mon problème similaire sans avoir besoin d'un autre spectacle.


Cela devrait être la réponse. Résolu mon problème, qui était le même problème que l'original "Asker" avait eu.


Vous m'avez fait connecter à nouveau sur GitHub juste pour vous uppoter. C'est l'idée. Conduite parfaite.