2010-09-25 7 views
11

Ich habe einige UUIDs, die zufällig in meinem Programm generiert werden, aber ich möchte in der Lage sein, den Zeitstempel der generierten UUID für Testzwecke zu extrahieren. Ich habe bemerkt, dass ich mit dem fields Accessor die verschiedenen Teile des Zeitstempels bekommen kann, aber ich habe keine Ahnung, wie man sie kombiniert.Extrahieren Sie die Zeit von einem UUID v1 in Python

Antwort

20

innen /usr/lib/python2.6/uuid.py Suchen Sie

def uuid1(node=None, clock_seq=None): 
    ... 
    nanoseconds = int(time.time() * 1e9) 
    # 0x01b21dd213814000 is the number of 100-ns intervals between the 
    # UUID epoch 1582-10-15 00:00:00 and the Unix epoch 1970-01-01 00:00:00. 
    timestamp = int(nanoseconds/100) + 0x01b21dd213814000L 

die Gleichungen für time.time() zu lösen sehen werden, werden Sie

time.time()-like quantity = ((timestamp - 0x01b21dd213814000L)*100/1e9) 

erhalten so verwenden:

In [3]: import uuid 

In [4]: u = uuid.uuid1() 

In [58]: datetime.datetime.fromtimestamp((u.time - 0x01b21dd213814000L)*100/1e9) 
Out[58]: datetime.datetime(2010, 9, 25, 17, 43, 6, 298623) 

das die mit einem UUID von uuid.uuid1 erzeugten zugehörigen Datetime gibt.

+0

Sehen aus wie Sie mein Problem gelöst. In der Zwischenzeit musste ich meinen eigenen Konstruktor erstellen, da nur die aktuellen Zeitstempel generiert wurden und ich zufällige Zeitstempel benötigte. Danke für Ihre schnelle Antwort :-) – cdecker

+1

interessant, UUID Epoche bezieht sich auf den Julianischen Kalender .. (Facepalm) – ezdazuzena

+2

@ezdazuzena Eigentlich Gregorian (siehe [RFC 4122, Abschnitt 4.1.4] (https://tools.ietf.org /html/rfc4122#section-4.1.4) über die Gregorianische Reform in den christlichen Kalender). Das ist natürlich völlig willkürlich, aber auch die UNIX-Epoche. Ich fordere Sie heraus, sich für ein besseres zu entscheiden, erklären Sie, warum Ihre Entscheidung nicht nur willkürlich ist, * und * zeigen Sie die Notwendigkeit, den bestehenden Standard (und die Anzahl abhängiger und indirekt abhängiger) zu ändern. – zxq9

3

Oder benutzen Sie einfach die TimeUUID library, so dass Sie wissen, dass Sie nicht die Mathematik falsch

Beispiel

import uuid 
import time_uuid 

my_uuid = uuid.UUID('{12345678-1234-5678-1234-567812345678}') 
ts = time_uuid.TimeUUID(bytes=my_uuid.bytes).get_timestamp() 
+0

Das Quell-Repo ist https://github.com/samuraisam/time_uuid – bcattle

6

bekommen haben könnten Sie eine einfache Formel verwenden, die direkt from the definition folgt:

Der Zeitstempel ist ein 60-Bit-Wert. Für UUID Version 1 ist dies , dargestellt durch Coordinated Universal Time (UTC) als eine Zählung von 100- Nanosekundenintervalle seit 00: 00: 00.00, 15. Oktober 1582 (das Datum Gregorianische Reform in den christlichen Kalender).

>>> from uuid import uuid1 
>>> from datetime import datetime, timedelta 
>>> datetime(1582, 10, 15) + timedelta(microseconds=uuid1().time//10) 
datetime.datetime(2015, 11, 13, 6, 59, 12, 109560) 
2

Da ich Cassandra installiert und ich bin mit diesem mit Cassandra ich in der Lage war, aus der datetime_from_uuid1 verwenden cassandra.util

>>> import uuid 
>>> from cassandra.util import datetime_from_uuid1 
>>> foo = uuid.uuid1() 
>>> dt_foo = datetime_from_uuid1(foo) 
>>> dt_foo 
datetime.datetime(2016, 07, 26, 8, 2, 12, 104560) 
Verwandte Themen