我有一些UUID在我的程序中随机生成,但我希望能够提取生成的UUID的时间戳以用于测试目的。我注意到使用fields
访问器我可以得到时间戳的各个部分,但我不知道如何组合它们。
答案 0 :(得分: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
求解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相关联的日期时间。
答案 1 :(得分:8)
您可以使用直接跟随from the definition的简单公式:
时间戳是60位值。对于UUID版本1,这是 由协调世界时(UTC)表示为100- 自1582年10月15日00:00:00.00(日期)起的纳秒间隔 格里高利改革基督教历法。)
>>> 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 :(得分:4)
或者只是使用TimeUUID library,这样你就知道你没有弄错数学
实施例
import uuid
import time_uuid
my_uuid = uuid.UUID('{12345678-1234-5678-1234-567812345678}')
ts = time_uuid.TimeUUID(bytes=my_uuid.bytes).get_timestamp()
答案 3 :(得分:2)
由于我安装了Cassandra并且我在Cassandra中使用它,因此我可以使用cassandra.util中的datetime_from_uuid1
>>> 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)