2016-06-15 16 views
1

Ich verwende Rails 4.2.3. Ich möchte eine Zeit in Millisekunden (eine Dauer, nicht eine UTC-Zeit) nehmen und sie in Stunden, Minuten und Sekunden umwandeln. Ich versuche diesProbleme beim Umwandeln von Millisekunden in einen formatierten Stunden-, Minuten- und Sekundenstring

Time.at(time_in_ms).utc.strftime("%H:%M:%S") 

aber das scheint nicht zu funktionieren. Zum Beispiel in meiner PostgreSQL-Datenbank, habe ich diese Menge an Millisekunden

3601000 

und die oben

16:16:40 

obwohl es wie „01.00.01“ etwas produziert (eine Stunde produzieren sollte und eine Sekunde). Was ist der richtige Weg, um die Zeit in Millisekunden in schön formatierte Stunden, Minuten und Sekunden zu konvertieren?

Antwort

1

Time.at() erwartet eine Zeit, in Sekundennach einer bestimmten Epoche - 1. Januar 1970 00.00.00 UTC - so Ihr Code die ms Zahl um 1000 zuerst teilen muss:

Time.at(time_in_ms/1000).utc.strftime("%H:%M:%S") 

EDIT: Ich überprüfte gerade die Ruby-Dokumente: der unten Reiter ist inkorrekt! Es wird angenommen, dass die eingegebene Anzahl von Sekunden in UTC ist, daher berücksichtigt at() die Berechnung THEN Faktoren in der UTC-Verschiebung. Das obige .utc macht dieses Factoring rückgängig und ist erforderlich.


Natürlich wird das Problem mit diesem Code dann Ihre aktuelle Zeitzone. Angenommen, Sie befinden sich in der UTC-5 (New Yorker Zeit): Time.at(3601000/1000) wird "01:00:01" Ortszeit. Die Konvertierung in UTC würde fünf Stunden von der Stundenzahl subtrahieren und es "20:00:01" machen. So entfernen Sie Ihre .utc Umwandlung zu:

Time.at(time_in_ms/1000).strftime("%H:%M:%S") 
+0

Hallo, Ich habe versucht, Ihren zweiten Ausdruck, aber das erzeugte das Ergebnis „20.00.01“ für die „3601000“ Zeit in Millisekunden. Es sollte "1:00:01" produziert haben, oder? –

+0

In welcher Zeitzone bist du? Hast du meinen ersten Ausdruck versucht? –

+0

Der Ausdruck, den ich habe, "3601000", ist eine Dauer, keine Zeit seit 1970 oder was auch immer dieser Ausdruck ist. Ich würde gerne einen Formatierungs-Ausdruck schreiben, der die gleiche Zahl "1:00:01" ausgibt, egal in welcher Zeitzone ich bin, da ich mich nicht auf die Uhrzeit an sich bezog. Ist das sinnvoll? –