Konvertieren der Epochenzeit mit Millisekunden in Datum / Uhrzeit

77

Ich habe ein Ruby-Skript verwendet, um den ISO-Zeitstempel in eine Epoche umzuwandeln. Die Dateien, die ich analysiere, haben die folgende Zeitstempelstruktur:

2009-03-08T00:27:31.807

Da ich Millisekunden behalten möchte, habe ich folgenden Ruby-Code verwendet, um ihn in die Epochenzeit zu konvertieren:

irb(main):010:0> DateTime.parse('2009-03-08T00:27:31.807').strftime("%Q")
=> "1236472051807"

Aber in Python habe ich Folgendes versucht:

import time 
time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(1236472051807))

Aber ich bekomme nicht die ursprüngliche Uhrzeit zurück,

>>> time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(1236472051807))
'41152-03-29 02:50:07'
>>> 

Ich frage mich, ob es damit zusammenhängt, wie ich formatiere.

Add-Semikolons
quelle

Antworten:

142

Verwendung datetime.datetime.fromtimestamp:

>>> import datetime
>>> s = 1236472051807 / 1000.0
>>> datetime.datetime.fromtimestamp(s).strftime('%Y-%m-%d %H:%M:%S.%f')
'2009-03-08 09:27:31.807000'

%fDirektive wird nur von unterstützt datetime.datetime.strftime, nicht von time.strftime.

UPDATE Alternative verwendet %, str.format:

>>> import time
>>> s, ms = divmod(1236472051807, 1000)  # (1236472051, 807)
>>> '%s.%03d' % (time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(s)), ms)
'2009-03-08 00:27:31.807'
>>> '{}.{:03d}'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(s)), ms)
'2009-03-08 00:27:31.807'
falsetru
quelle
2
Ja, ich wollte das vorschlagen ... aber meh gute Antwort (+1 für die Erhaltung der Millisekunden im Display :))
Joran Beasley
Tolle Antwort auch @JoranBeasley deine ist auch toll :) Danke Jungs.
Add-Semikolons
Bitte beachten Sie, dass die erste Antwort von @falsetru durch Gleitkomma dividiert wird, 1000.0wodurch die Millisekunden in der Datumszeit beibehalten werden.
Lorenzo Belli
Vielen Dank. Genau das, wonach ich gesucht habe
Anish
17

das sind milisekunden, dividiere sie einfach durch 1000, da gmtime sekunden erwartet ...

time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(1236472051807/1000.0))
Joran Beasley
quelle
4
Ich verstehe, aber ich werde die Millisekunden verlieren, oder?
Add-Semikolons
1
ja ... ich denke, Sie können sie behalten, indem Sie dies tun, timestamp/1000.0 wodurch sie als Dezimalzahl übergeben werden ... (obwohl ich nicht sicher bin , ob Sie sie abrufen können)
Joran Beasley
Gibt es ein Äquivalent zu gmtime, das Mikro- oder Millisekunden als Eingabe benötigt?
Rutger Hofste
1
seconds == milliseconds/1000... wenn Sie dies in eine Funktion setzen, haben Sie eine gmtime, die Millisekunden akzeptiert ... Mikrosekunden, die Sie einfach durch 10 ^ 6 teilen
Joran Beasley