2012-03-28 16 views
6

मैं स्थानीय समय में युग के समय को बदलने के लिए datetime.fromtimestamp का उपयोग कर रहा हूं। मैंने पाया कि datetime.fromtimestamp एक निश्चित समय पर एक घंटे की एक अलग छलांग लगाता है और मैं पूरी तरह से परेशान हूं कि ऐसा क्यों करता है।पायथन का 'सेटिमस्टैम्प' एक अलग कूद

(मैं भी time.mktime उपयोग कर रहा हूँ युग समय में एक datetime वस्तु कन्वर्ट करने के लिए, as suggested by Raymond Hettinger। मुझे यकीन है यह इस प्रश्न के लिए प्रासंगिक जानकारी है कि क्या नहीं कर रहा हूँ तो मैं बस के मामले में यह कह रहा हूँ।)

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import time, datetime 
>>> def datetime_to_epoch_time(datetime_): 
...  return time.mktime(datetime_.timetuple()) + datetime_.microsecond/1e6 
... 

एक विशिष्ट युग समय चुनने:

>>> x = datetime_to_epoch_time(datetime.datetime(2012, 3, 30, 3, 0)) 

यह एक datetime में कनवर्ट कर रहा fromtimestamp का उपयोग कर:

>>> datetime.datetime.fromtimestamp(x) 
datetime.datetime(2012, 3, 30, 3, 0) 

हमें 3 बजे का समय मिलता है।

अब समय ठीक एक दूसरे है कि यह पहले परिवर्तित करते हैं:

>>> datetime.datetime.fromtimestamp(x-1) 
datetime.datetime(2012, 3, 30, 1, 59, 59) 

हम अचानक 1:59 प्राप्त करें!

क्या हुआ? मुझे पता है कि इस तरह की चीजें छलांग के दिनों के आसपास होती हैं, लेकिन 30 मार्च के बाद से एक लीप दिन कब होता है?

मुझे ध्यान रखना चाहिए कि मैंने यह केवल लिनक्स पर किया है, न कि विंडोज़ पर। और मुझे लगता है कि विभिन्न लिनक्स कंप्यूटर (विभिन्न टाइमज़ोन में) में एक अलग समय बिंदु होता है जिसमें fromtimestamp कूदता है।

उत्तर

4

आसान। 30 मार्च संभवतः आपके टाइमज़ोन में डेलाइट बचत समय स्विच है।

तो उस दिन, समय वास्तव में 1:59:59 से 3:00:00

+0

मुझे लगता है। तो 'fromtimestamp' उस समय क्षेत्र से अवगत है जिसमें मैं रहता हूं और जानता हूं कि कौन से घंटों को छोड़ना है। लेकिन 'डेटाटाइम' ऑब्जेक्ट्स इस कूद से अवगत नहीं हैं: अगर मैं 2 बजे के लिए 'डेटाटाइम' ऑब्जेक्ट को 2am के लिए घटाता हूं, तो मुझे एक घंटे का 'टाइमडेल्टा' मिलता है, जहां मुझे शून्य मिलना चाहिए। –

+0

फिर, मैं अपने टाइमज़ोन के बारे में जागरूक 'डेटाटाइम' ऑब्जेक्ट्स कैसे बना सकता हूं, और उन्हें * सटीक * कुछ टाइमज़ोन का उपयोग 'सेटिमस्टैम्प' के रूप में करता हूं, इसलिए वे पूरी तरह सिंक्रनाइज़ हो जाएंगे? टाइमस्टैम्प का निर्माण करते समय –

+0

@ रामरामम 'tzinfo' ध्वज पास करें। 'pytz' लाइब्रेरी उसमें कुछ मदद की जा सकती है। – Amber

7

fromtimestamp वर्तमान उपयोगकर्ता के "स्थानीय पर्यावरण" का उपयोग करता है करने के लिए जाना था, POSIX सी पुस्तकालय द्वारा परिभाषित के रूप में (man (3) tzset देखते हैं, और time मॉड्यूल के दस्तावेज़)।

यदि आप वास्तव में pytz वर्तमान उपयोगकर्ता के पर्यावरण के स्थानीय समय का प्रतिनिधित्व करना चाहते हैं, तो datetime-tz पैकेज में ऑटो-डिटेक्टिंग के लिए एक फ़ंक्शन है।

हालांकि, सामान्य ज्ञान हमेशा यूटीसी के साथ काम करना है, और सभी डीएसटी मुद्दों से बचें (केवल अंतिम प्रदर्शन के लिए स्थानीय टाइमज़ोन का उपयोग करें)। datetime.fromtimestamp(x, tz=pytz.UTC) का उपयोग करें, या, यदि आप pytz की जरूरत नहीं है:

>>> datetime.datetime.fromtimestamp(x) 
datetime.datetime(2012, 3, 30, 3, 0) 
>>> datetime.datetime.utcfromtimestamp(x) 
datetime.datetime(2012, 3, 30, 0, 0) 
>>> datetime.datetime.utcfromtimestamp(x-1) 
datetime.datetime(2012, 3, 29, 23, 59, 59) 

पी.एस. आप अपनी प्रक्रिया 'लोकेल को यूटीसी पर भी सेट कर सकते हैं (लेकिन यह गैर-पॉज़िक्स ओएस पर काम नहीं कर सकता है):

>>> import os,time 
>>> os.environ["TZ"] = "UTC" 
>>> time.tzset() 
>>> datetime.datetime.fromtimestamp(x) 
datetime.datetime(2012, 3, 30, 0, 0) 
+0

+1 महान सलाह। –

संबंधित मुद्दे