2009-07-10 15 views
38

मैं पाइथन से अपने सिस्टम का डिफ़ॉल्ट टाइमज़ोन (पीएसटी) प्राप्त करना चाहता हूं। ऐसा करने का सबसे अच्छा तरीका क्या है? मैं एक और प्रक्रिया को रोकने से बचना चाहता हूं।पायथन में सिस्टम की समय क्षेत्र जानकारी प्राप्त करें?

उत्तर

10

पायथन Time मॉड्यूल देखें।

from time import gmtime, strftime 
print strftime("%z", gmtime()) 

प्रशांत मानक समय

+0

क्या हम विभिन्न दस्तावेजों को देख रहे हैं या यह '% Z'' है? – SilentGhost

+0

@ साइलेंटगोस्ट: "% z" और '% z' बिल्कुल पायथन में समान हैं। – ahawker

+11

हां, लेकिन ** ऊपरी मामले ** 'Z' और ** लोअर-केस **' z' नहीं हैं। – SilentGhost

60

काम करना चाहिए कि:

import time 
time.tzname 

यह दो तार की एक टपल देता है: पहले स्थानीय गैर-डीएसटी समय क्षेत्र का नाम है, पीछे नहीं है स्थानीय डीएसटी टाइमज़ोन का नाम।

+19

इसे आगे ले जाने के लिए, आप 'time.tzname [time.daylight]' का नाम प्राप्त करने के लिए उपयोग कर सकते हैं वर्तमान टाइमज़ोन, डेलाइट सेविंग टाइम के लिए लेखांकन। –

+9

फिर, 'time.daylight' इंगित नहीं करता कि डीएसटी सक्रिय है। यह केवल इंगित करता है कि टाइमस्टोन द्वारा डीएसटी मनाया जाता है या नहीं। आप 'time.localtime()। Tm_isdst' की तलाश में हैं। – marr75

+0

बस विंडोज उपयोगकर्ताओं के लिए जोड़ने के लिए, टाइमज़ोन के मानों को 'HKEY_LOCAL_MACHINE \ सॉफ़्टवेयर \ माइक्रोसॉफ्ट \ विंडोज एनटी \ CurrentVersion \ Time Zones \ ' – swdev

4

आप तार से अधिक यूटीसी ऑफसेट पसंद करते हैं:

time.timezone/-(60*60) 
+4

यह गलत तरीके से गणना करेगा जब (/ if) डीएसटी प्रभावी है। – marr75

20

एक यूटीसी ThomasH के जवाब में की तरह ऑफसेट देती है, लेकिन खाते में डेलाइट सेविंग लेता है।

>>> import time 
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone 
>>> offset/60/60 * -1 
-9 

time.timezone या time.altzone का मूल्य (यूटीसी के क्षेत्रों पूर्व एक नकारात्मक मूल्य मिल रहा है के साथ) यूटीसी के सेकंड पश्चिम में है। यह विपरीत है कि हम वास्तव में इसे कैसे पसंद करेंगे, इसलिए * -1।

time.localtime().tm_isdst शून्य होगा यदि डेलाइट बचत वर्तमान में प्रभावी नहीं है (हालांकि यह सही नहीं हो सकता है कि किसी क्षेत्र ने हाल ही में अपना डेलाइट बचत कानून बदल दिया है)।

संपादित करें: marr75 सही है, मैंने तदनुसार जवाब संपादित किया है।

+1

सुरक्षित होने के लिए, मुझे लगता है कि ऑफ़सेट चेक को उलट दिया जाना चाहिए (altzone अगर dst = 1 else timezone)। यदि डीएसटी स्थिति किसी भी तरह अज्ञात है, तो 'tm_isdst'' -1' होगा, और वर्तमान कोड इस मामले में 'altzone' के लिए डिफ़ॉल्ट होगा। उन क्षेत्रों के लिए जो डीएसटी का उपयोग नहीं करते हैं, यह मान कभी भी सही नहीं होता है, इसलिए 'टाइमज़ोन' शायद फॉलबैक होना चाहिए। (मुझे यकीन नहीं है कि '-1' वास्तव में 'लोकलटाइम' से संभव आउटपुट है) – nmclean

+1

[सभी altzone, टाइमज़ोन-आधारित समाधान कुछ किनारे के मामलों में विफल हो सकता है] (http://bugs.python.org/issue1647654) – jfs

11

ऑफ़सेट की गणना के लिए कोड स्निपेट गलत हैं, http://bugs.python.org/issue7229 देखें।

इस संभाल करने के लिए सही तरीका है:

def local_time_offset(t=None): 
    """Return offset of local zone from GMT, either at present or at time t.""" 
    # python2.3 localtime() can't take None 
    if t is None: 
     t = time.time() 

    if time.localtime(t).tm_isdst and time.daylight: 
     return -time.altzone 
    else: 
     return -time.timezone 

यह सभी संभावना, नहीं सही प्रश्न का कि ओपी पूछा में है, लेकिन वहां पेज और समय कीड़े पर दो गलत स्निपेट को ट्रैक करने चूसना हैं और ठीक है।

+0

1. यदि आप 'tm_isdst' जानते हैं; आपको 'डेलाइट' 2' की जांच करने की आवश्यकता नहीं है। [सभी 'altzone',' टाइमज़ोन '-आधारित समाधान कुछ किनारे के मामलों में विफल हो सकता है] (http://bugs.python.org/issue1647654) – jfs

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