从python中的UUID v1中提取时间

cde*_*ker 18 python uuid timestamp

我有一些UUID在我的程序中随机生成,但我希望能够提取生成的UUID的时间戳以用于测试目的.我注意到使用fields访问器我可以得到时间戳的各个部分,但我不知道如何组合它们.

unu*_*tbu 28

查看/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
Run Code Online (Sandbox Code Playgroud)

解决time.time()的方程,你会得到

time.time()-like quantity = ((timestamp - 0x01b21dd213814000L)*100/1e9)
Run Code Online (Sandbox Code Playgroud)

所以使用:

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)
Run Code Online (Sandbox Code Playgroud)

这给出了与生成的UUID相关联的日期时间uuid.uuid1.

  • @ezdazuzena实际上,Gregorian(参见[RFC 4122,第4.1.4节](https://tools.ietf.org/html/rfc4122#section-4.1.4)关于基督教历法的格里高利改革).当然,这完全是武断的,但UNIX时代也是如此.我挑战你挑选一个更好的,解释为什么你的决定不是随意的,*和*证明需要改变现有的标准(以及一系列依赖和间接依赖的标准)来跟随你. (2认同)

jfs*_*jfs 9

您可以使用直接来自定义的简单公式:

时间戳是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)
Run Code Online (Sandbox Code Playgroud)


Jos*_*ust 6

或者只是使用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()
Run Code Online (Sandbox Code Playgroud)

  • 我不建议为一行代码添加依赖项。 (3认同)