2012-09-25 3 views
5

में डेटाटाइम पर माइक्रोसॉन्ड टाइमस्टैम्प को कनवर्ट करें मैं Google क्रोम से कुकी की समाप्ति तिथि खींच रहा हूं। ऐसा लगता है कि क्रोम एक टाइमस्टैम्प के साथ कुकी समाप्ति को संग्रहीत कर रहा है जो 1601-01-01 00:00:00 युग के रूप में यूटीसी का उपयोग करता है। मेरा वर्तमान कार्यान्वयन इस प्रकार है:पाइथन

stamp = int(result[3]) 
date = datetime.datetime.fromtimestamp(stamp/10000000.0) 
print date.year 

हालांकि, यह गलत तिथि (लगभग एक वर्ष तक बंद) का उत्पादन कर रहा है। मुझसे यहां क्या गलत हो रहा है?

+2

कर सकते हैं आप एक उदाहरण युग टाइमस्टैम्प और संबंधित अपेक्षित डेटाटाइम देते हैं? – moooeeeep

+0

इसके अलावा, '10000000.0' माइक्रोसॉन्ड के लिए सही है? –

+0

13022344559000000 - 30 AUG 2013 06:55 पूर्वाह्न –

उत्तर

7

एक अन्य विकल्प, अजगर 3.2 के बाद मानक पुस्तकालय से tzinfo हो रही है (बड़े अजगर संस्करणों के लिए आप अगर pytz से प्राप्त कर सकते हैं):

>>> import pytz 
>>> from datetime import datetime, timedelta, timezone 
>>> epoch = datetime(1601, 1, 1, tzinfo=timezone.utc) 
>>> cookie_microseconds_since_epoch = 13022344559000000 
>>> cookie_datetime = epoch + timedelta(microseconds=cookie_microseconds_since_epoch) 
>>> str(cookie_datetime) 
'2013-08-29 13:55:59+00:00' 

मुझे लगता है कि यह मान आपके अपेक्षित मूल्य में अंतर टाइमज़ोन ऑफसेट है।

अद्यतन:

@JFSebastian सही ढंग से बताते हैं, यदि आप अंतर्निहित यूटीसी अनुभवहीनdatetime वस्तुओं का उपयोग कर रहे, tzinfo अनावश्यक है और इसके बाद के संस्करण के लिए सरल किया जा सकता:

>>> from datetime import datetime, timedelta 
>>> epoch = datetime(1601, 1, 1) 
>>> cookie_microseconds_since_epoch = 13022344559000000 
>>> cookie_datetime = epoch + timedelta(microseconds=cookie_microseconds_since_epoch) 
>>> str(cookie_datetime) 
'2013-08-30 13:55:59' 
+0

उचित वर्ष 2013 है। साल का साल क्यों बंद है? –

+1

क्योंकि वह 1601 के बजाय 1600 पर आधारित था। – wberry

+0

आप सही हैं। सही 1601 आधारित युग रखने के लिए उदाहरण को फिक्स्ड करें। इस मामले में –

1

मुझे यकीन नहीं है कि आप किस डेटा से शुरुआत कर रहे हैं लेकिन यहां एक पूर्णांक टाइमस्टैंप से शुरू होने वाला एक उदाहरण है। मानता है कि pytz मॉड्यूल मौजूद है (जो मैं अत्यधिक अनुशंसा करता हूं)।

>>> import datetime, pytz 
>>> x = datetime.datetime.fromtimestamp(0) 
>>> x = x.replace(tzinfo=pytz.UTC) 
>>> str(x) 
'1970-01-01 00:00:00+00:00' 
>>> d = datetime.timedelta(365 * (1970 - 1601)) 
>>> str(x - d) 
'1601-03-31 00:00:00+00:00' 
>>> d = datetime.timedelta(365 * (1970 - 1601) + 31 + 28 + 31 - 1) 
>>> str(x - d) 
'1601-01-01 00:00:00+00:00' 
>>> str(d) 
'134774 days, 0:00:00' 

तो आपके पास यह है। 1 जनवरी 1601 युग और 1 जनवरी 1 9 70 के युग के बीच रूपांतरण 134774 दिन है।

क्यों दिनों की संख्या? अधिवर्ष! हमने कुछ निश्चित दिनों को जोड़ा, वर्षों से नहीं। (। वास्तव में, adding years is not directly supportedtimedelta वस्तुओं में)

+0

यह काम करता है, लेकिन मुझे लगता है कि पेड्रो रोमानो का समाधान, 1647-01-01 युग के साथ गणना कर रहा है, जो स्थिर रूप से 134774-दिन ऑफसेट को समझने और इसकी गणना करने के बजाए बेहतर है (जब तक कि यह किसी स्क्रिप्ट के लिए प्रदर्शन समस्या नहीं है लाखों बार या कुछ चलाने के लिए ...)। – abarnert

+0

समान प्रदर्शन के बारे में होना चाहिए। उनका तरीका, आप 1 9 70 के युग के खिलाफ 1601 की तारीख की गणना करते हैं और फिर अपना समय ऑफसेट जोड़ते हैं। इस तरह, आप 1 9 70 के समय के समय के ऑफसेट का इलाज करते हैं तो युग के बीच अंतर घटाते हैं। – wberry