2010-09-25 30 views
11

Tôi có một số UUID được tạo trong chương trình của mình một cách ngẫu nhiên, nhưng tôi muốn có thể trích xuất dấu thời gian của UUID được tạo ra cho mục đích thử nghiệm. Tôi nhận thấy rằng bằng cách sử dụng accessor fields tôi có thể nhận được các phần khác nhau của dấu thời gian nhưng tôi không có ý tưởng về cách kết hợp chúng.Trích xuất thời gian từ UUID v1 trong python

Trả lời

20

Nhìn bên /usr/lib/python2.6/uuid.py bạn sẽ thấy

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 

giải quyết các phương trình cho time.time(), bạn sẽ nhận được

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

Vì vậy, sử dụng:

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) 

Điều này cho giờ kết hợp với UUID được tạo bởi uuid.uuid1.

+0

Hình như bạn giải quyết vấn đề của tôi. Trong thời gian chờ đợi, tôi phải quay lại và tạo một hàm tạo riêng vì nó chỉ tạo ra các dấu thời gian hiện tại và tôi cần các dấu thời gian ngẫu nhiên trong quá khứ. Cảm ơn bạn đã trả lời nhanh chóng của bạn :-) – cdecker

+1

thú vị, uuid epoch đề cập đến lịch Julian .. (facepalm) – ezdazuzena

+2

@ezdazuzena Trên thực tế, Gregorian (xem [RFC 4122, phần 4.1.4] (https://tools.ietf.org /html/rfc4122#section-4.1.4) về cải cách Gregorian theo lịch Kitô giáo). Điều này hoàn toàn tùy ý, tất nhiên, nhưng cũng là kỷ nguyên UNIX. Tôi thách thức bạn chọn một cái tốt hơn, giải thích tại sao quyết định của bạn không chỉ là tùy ý, * và * chứng minh sự cần thiết phải thay đổi tiêu chuẩn hiện tại (và hàng loạt phụ thuộc và gián tiếp phụ thuộc) để theo bạn. – zxq9

3

Hoặc chỉ cần sử dụng TimeUUID library, để bạn biết bạn đã không nhận được toán sai

Ví dụ

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

Nguồn repo là https://github.com/samuraisam/time_uuid – bcattle

6

Bạn có thể sử dụng một công thức đơn giản mà sau trực tiếp from the definition:

Dấu thời gian là giá trị 60 bit. Đối với phiên bản UUID 1, đây là được đại diện bởi Giờ quốc tế phối hợp (UTC) với số lượng khoảng 100- khoảng thời gian nano từ 00: 00: 00.00, 15 tháng 10 năm 1582 (ngày cải cách Gregorian theo lịch Kitô giáo).

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

Kể từ khi tôi có Cassandra cài đặt và tôi đang sử dụng này với Cassandra tôi đã có thể sử dụng datetime_from_uuid1 từ 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) 
Các vấn đề liên quan