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.

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'

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))

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.