2010-09-25 10 views
11

में यूयूआईडी v1 से समय निकालें मेरे पास कुछ प्रोग्राम हैं जो मेरे प्रोग्राम में यादृच्छिक रूप से जेनरेट किए जा रहे हैं, लेकिन मैं परीक्षण उद्देश्यों के लिए जेनरेट किए गए यूयूआईडी के टाइमस्टैम्प को निकालने में सक्षम होना चाहता हूं। मैंने देखा कि fields एक्सेसर का उपयोग करके मैं टाइमस्टैम्प के विभिन्न हिस्सों को प्राप्त कर सकता हूं लेकिन मुझे नहीं पता कि उन्हें कैसे गठबंधन किया जाए।पाइथन

उत्तर

20

अंदर खोज रहे हैं /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 के साथ जुड़े दिनांक देता है।

+0

ऐसा लगता है कि मेरी समस्या हल datetime_from_uuid1 उपयोग करने में सक्षम था। इस बीच मुझे वापस जाना पड़ा और अपना खुद का कन्स्ट्रक्टर बनाना पड़ा क्योंकि यह केवल वर्तमान टाइमस्टैम्प उत्पन्न कर रहा था, और मुझे यादृच्छिक पिछले टाइमस्टैम्प की आवश्यकता थी। आपके त्वरित उत्तर के लिए धन्यवाद :-) – cdecker

+1

दिलचस्प, यूयूड युग जूलियन कैलेंडर को संदर्भित करता है .. (फेसपाल्म) – ezdazuzena

+2

@ezdazuzena दरअसल, ग्रेगोरियन (देखें [आरएफसी 4122, सेक्शन 4.1.4] (https://tools.ietf.org /html/rfc4122#section-4.1.4) ईसाई कैलेंडर में ग्रेगोरियन सुधार के बारे में)। यह पूरी तरह से मनमाना है, लेकिन यूनिक्स युग भी है। मैं आपको एक बेहतर चुनने के लिए चुनौती देता हूं, समझाओ कि आपका निर्णय मनमाने ढंग से क्यों नहीं है, और * मौजूदा मानक (और निर्भर और अप्रत्यक्ष रूप से आश्रित लोगों की हत्या) को बदलने के लिए अपनी आवश्यकता का पालन करने की आवश्यकता को प्रदर्शित करता है। – zxq9

3

या बस, 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() 
+0

स्रोत रेपो https://github.com/samuraisam/time_uuid है – bcattle

6

आप एक सरल सूत्र कि सीधे from the definition इस प्रकार इस्तेमाल कर सकते हैं नहीं मिला:

टाइमस्टैंप 60-बिट मान है। यूयूआईडी संस्करण 1 के लिए, यह है जो 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) 
2

कैसेंड्रा स्थापित जब से मैं है और मैं कैसेंड्रा के साथ इस का उपयोग कर रहा मैं से 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)