getHours() gibt falschen Wert
Bin ich mit JavaScript-Date-Objekt zu konvertieren Millisekunden in ein lesbares minutes:seconds
formatierten string. Ich brauche es, erstellen Sie einen timer für eine benutzerdefinierte video-player, wo meine JS-interface empfängt die video-Dauer-info als einer Millisekunde Wert.
Es ist schon eine ziemlich triviale Aufgabe, vor der ich mich entschlossen, die Möglichkeit ein video mehr als 59 Minuten. Und dann traf ich dieses problem: wenn ich senden Sie eine Millisekunde Wert um die neue Date-Objekt, Konstruktor, und rufen Sie dann getHours()
, wird es wieder etwas, auch wenn die Anzahl der Millisekunden steht für einen Zeitraum, der weniger als eine Stunde. Der einfachste Weg, um dies in Aktion zu sehen ist, füttern es, sagen wir, 0.
Ich würde erwarten, dass es zu 0 zurück, aber es gibt immer 12 (13 in der Oper, die macht es noch mehr komisch). Ist das ein normales Verhalten oder ist es ein bug? So oder so, wie kann ich zuverlässig erkennen, ob mein Millisekunden Wert ist nur um Minuten und Sekunden oder auch Stunden umfasst?
Dank.
UPD:
Ich habe es getestet in Chrome 15 und Firefox 7 auf OSX: das gleiche Ergebnis wie per screenshot oben). Ich kann nicht herausfinden, wie man mit Opera Dragonfly Konsole, aber was ich sehe, passiert auch in der Oper, nur mit dem Wert von 13 für getHours()
.
- Sie don ' T wollen, verwenden Sie die
Date
Konstruktor hier.new Date( n )
gibt eineDate
- Objekt mit dem Datum auf 1. Januar 1970 +n
Millisekunden, das ist sicherlich nicht das, was Sie wollen... - also, was wäre eine gute alternative?
- Ich würde das schreiben meiner eigenen Funktion.
- Hier gehen Sie: jsfiddle.net/X5hn5/1
- das ist genial, einfach und zuverlässig. Danke!!!
- Ich habe erweitert und verbessert Ihre Funktion, falls es Sie interessiert: jsfiddle.net/j9zNa/1
- Ich habe umgestalteten es ein bisschen... jsfiddle.net/j9zNa/2
- cool!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie anrufen
new Date(0).toString()
und sehen, ob es eine Zeitzone, die es beeinflussen?Mir gibt
Da bin ich auf GMT+2, also
getHours
gibt 2 mir.Der Unix-Epoche eingestellt ist GMT+0
Verwenden
+new Date
um zuverlässige Millisekunden zu einem Zeitpunkt und halten Sie es als Zahl. Nicht Mathematik innerhalb von einem tatsächlichen date-Objekt.Hier ist, was ich verwendet habe:
Gelten benutzerdefinierte Formatierung wie nötig. Das nimmt wirklich Sekunden, so teilen Millisekunden durch 1000 um Sekunden.
Merke ich, dass, während die Menschen informiert den Benutzer auf, wie man fix seinen code, Sie habe nicht informieren ihn darüber auf, wie das zu tun, was er verlangt. Die Antwort ist ziemlich einfach. Verwenden Sie nicht die Funktion getHours(). Verwenden getUTCHours(). Dadurch umgehen Sie jeder Zeitzone offset.
Werden Sie noch Probleme haben, wenn Sie jemals brauchen, um zu gehen bis zu Tagen, aber bis dahin, das Datum primitive wird nur gut funktionieren, für was Sie es für verwenden.
Ich weiß, du bist nicht danach Fragen, und es ist ärgerlich, um Antworten zu erhalten, die nicht Ihre Frage, aber in diesem Fall... ich würde ernsthaft empfehlen den Wechsel zu Datejs, bevor Sie sich viel Arbeit noodling herum mit JS die nativen Date () - Objekt, das ist nicht allzu mächtig und kann eine Quelle für viele Probleme, vor allem, wenn Sie haben, zu normalisieren, Zeitzonen!
http://www.datejs.com/
Versuchen Sie, die Jahr, Monat, Tag, Stunden, Minuten, Sekunden UND Millisekunden Wert statt:
0
.