Извлечь время из UUID v1 в Python - PullRequest
       38

Извлечь время из UUID v1 в Python

15 голосов
/ 26 сентября 2010

У меня есть несколько UUID, которые генерируются в моей программе случайным образом, но я хочу иметь возможность извлечь временную метку сгенерированного UUID для тестирования.Я заметил, что используя аксессор fields, я могу получить различные части метки времени, но я не знаю, как их объединить.

Ответы [ 4 ]

28 голосов
/ 26 сентября 2010

Заглянув внутрь /usr/lib/python2.6/uuid.py, вы увидите

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

Решив уравнения для time.time (), вы получите

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

Так что используйте:

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)

Это дает дату и время, связанные с UUID, сгенерированным uuid.uuid1.

8 голосов
/ 13 ноября 2015

Вы можете использовать простую формулу, которая следует непосредственно из определения :

Временная метка является 60-битным значением. Для UUID версии 1 это представлен Всемирным координированным временем (UTC) как счет 100- наносекундные интервалы с 00:00 до 00:00 15 октября 1582 г. (дата Григорианская реформа христианского календаря).

>>> 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)
4 голосов
/ 13 ноября 2015

Или просто используйте библиотеку TimeUUID , чтобы вы знали, что не поняли математическую ошибку

Пример

import uuid
import time_uuid

my_uuid = uuid.UUID('{12345678-1234-5678-1234-567812345678}')
ts = time_uuid.TimeUUID(bytes=my_uuid.bytes).get_timestamp()
2 голосов
/ 27 июля 2016

Поскольку у меня установлена ​​Cassandra, и я использую ее с Cassandra, я смог использовать datetime_from_uuid1 из 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)
...