在Python中从UUID v1中提取时间

28 投票
4 回答
26505 浏览
提问于 2025-04-16 04:35

我在程序里随机生成了一些UUID(通用唯一识别码),但我想提取这些UUID生成的时间戳,以便进行测试。我发现使用fields这个工具可以获取时间戳的不同部分,但我不知道怎么把这些部分组合起来。

4 个回答

12

或者直接使用 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()
19

你可以使用一个简单的公式,这个公式直接来自于定义

时间戳是一个60位的值。对于UUID的第1版,这个值是用协调世界时(UTC)来表示的,具体是从1582年10月15日00:00:00.00开始,计算100纳秒的间隔数。

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

在 /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.uuid1 生成的 UUID 相关的日期和时间。

撰写回答