2009-11-05 14 views
18

क्या python (या pytz) में एक क्रॉस-प्लेटफ़ॉर्म फ़ंक्शन है जो वर्तमान में कंप्यूटर पर सेट किए गए टाइमज़ोन से संबंधित tzinfo ऑब्जेक्ट देता है?वर्तमान टाइमज़ोन से संबंधित tz_info ऑब्जेक्ट कैसे प्राप्त करें?

वातावरण चर के रूप में वे पार मंच

उत्तर

7
>>> import datetime 
>>> today = datetime.datetime.now() 
>>> insummer = datetime.datetime(2009,8,15,10,0,0) 
>>> from pytz import reference 
>>> localtime = reference.LocalTimezone() 
>>> localtime.tzname(today) 
'PST' 
>>> localtime.tzname(insummer) 
'PDT' 
>>> 
+4

['pytz' docs कहो कि 'pytz।संदर्भ'] (http://pytz.sourceforge.net/#problems-with-localtime) का उपयोग किया जाना चाहिए * केवल परीक्षणों के लिए *। – jfs

+0

यह चेतावनी 'context.USTimeZone' पर लागू होती है, जो यूएस डीएसटी के लिए 2007 के पूर्व नियमों का उपयोग करती है। हालांकि, 'संदर्भ। लोकलटाइज़ोन', यहां उपयोग किया जाता है, 'time.localtime' के व्यवहार की जांच करता है, जिसका शुद्धता सिस्टम पुस्तकालयों के साथ बनाए रखा जाता है। 'संदर्भ। लोकल टाइमज़ोन' यूएस नियमों में 2007 के परिवर्तन से पहले और बाद में सही डीएसटी संक्रमण देता है; मैंने अन्य देशों के लिए परीक्षण नहीं किया है। – rob

+2

@rob: ** गलत **। 'लोकलटाइमज़ोन()' का उपयोग न करें। 'pytz'' time.timezone', 'time.altzone', 'localTimezone()' द्वारा उपयोग किए जाने पर * ऐतिहासिक * टाइमज़ोन डेटा प्रदान करता है, यानी सबसे अच्छा है * वे सबसे हालिया * टाइमज़ोन परिभाषा को प्रतिबिंबित करते हैं। स्थानीय टाइमज़ोन में पिछले/भविष्य में अलग-अलग यूटीसी ऑफ़सेट हो सकते हैं, उदाहरण के लिए, 2010-2015 में यूरोप/मॉस्को टाइमज़ोन आज़माएं और देखें कि आपके लिए क्या होता है। – jfs

2

time.timezone रिटर्न वर्तमान समय क्षेत्र ऑफसेट नहीं हैं पर नहीं गिना जा सकता है। यदि आपको अधिक जटिल संरचना की आवश्यकता है, तो datetime.tzinfo भी है।

+0

time.timezone() बस यूटीसी से ऑफसेट लौटाता है। मुझे एक tzinfo वस्तु चाहिए। इसलिए मैं शायद यह काम करूंगा कि: 1. tzinfo ऑब्जेक्ट से संबंधित वर्ग को परिभाषित करें 2. ऑब्जेक्ट को इंस्टेंस करें 3. इसे वापस करें –

+0

'डेटाटाइम' दस्तावेज़ों में एक उदाहरण है जो 'tzinfo' के उपयोग को समझाता है। – SilentGhost

+0

'datetime.datetime.now() + डेटाटाइम.timedelta (सेकंड = time.timezone) 'चाल अच्छी तरह से किया था। – Baczek

0

मैंने इसे स्वयं नहीं उपयोग किया है, लेकिन dateutil.tz.tzlocal() को चाल चलनी चाहिए।

http://labix.org/python-dateutil#head-50221b5226c3ccb97daa06ea7d9abf0533ec0310

+0

'tzlocal()' अतीत की तिथियों के लिए असफल हो सकता है, उदाहरण के लिए, 'यूरोप/मॉस्को' टाइमज़ोन के पास 2011 से पहले विभिन्न यूटीसी ऑफ़सेट था ('डेट्यूटील' विफल रहता है, लेकिन 'पायट्ज़' ऐसे समय क्षेत्र के लिए काम करता है) – jfs

0

शायद कोशिश:

import time

print time.tzname #or time.tzname[time.daylight]

+0

इसे पहले उत्तर के साथ तुलना करें, क्यों -1? –

+0

['time.daylight'] कहता है कि वर्तमान टाइमज़ोन में डीएसटी है या नहीं। यह इंगित नहीं करता कि डीएसटी अभी प्रभावी है या नहीं। साथ ही 'time.tzname' एक 'tzinfo' उदाहरण नहीं है (यह एक स्ट्रिंग है)। देखें [सिस्टम टाइमज़ोन सेटिंग कैसे प्राप्त करें और इसे pytz.timezone पर पास करें?] (Http://stackoverflow.com/q/13218506/4279) यह समझने के लिए कि भले ही आपको सही tzname मिले; इसका मतलब यह नहीं होगा कि आपको स्थानीय टाइमज़ोन मिलेगा। देखें [पाइथन में कंप्यूटर का यूटीसी ऑफ़सेट प्राप्त करना] (http://stackoverflow.com/a/3168394/4279) जो वर्तमान यूटीसी ऑफसेट प्राप्त करने के लिए कई दृष्टिकोण प्रदर्शित करता है। – jfs

7

tzlocal module कि pytz समय क्षेत्र देता है * nix और Win32 पर काम करता है:

from datetime import datetime 
from tzlocal import get_localzone # $ pip install tzlocal 

# get local timezone  
local_tz = get_localzone() 


print local_tz.localize(datetime(2012, 1, 15)) 
# -> 2012-01-15 00:00:00+04:00 # current utc offset 
print local_tz.localize(datetime(2000, 1, 15)) 
# -> 2000-01-15 00:00:00+03:00 # past utc offset (note: +03 instead of +04) 
print local_tz.localize(datetime(2000, 6, 15)) 
# -> 2000-06-15 00:00:00+04:00 # changes to utc offset due to DST 

नोट: यह डीएसटी और गैर-डीएसटी यूटीसी दोनों ऑफसेट परिवर्तनों को ध्यान में रखता है।

-1

मैं अपने आप से ही पूछ रहा था, और मैं में [1] जवाब मिला:

खंड 8.1.7 पर एक नज़र डालें: प्रारूप "% z" (लोअरकेस, जेड अपरकेस रिटर्न भी समय क्षेत्र, लेकिन 4 अंकों के प्रारूप में नहीं, लेकिन टाइमज़ोन संक्षेप के रूप में, जैसे [3]) स्ट्रैटाइम के रूप में "+/- 4DIGIT" फ़ॉर्म लौटाता है जो ईमेल शीर्षकों में मानक है (आरएफसी 2822 की धारा 3.3 देखें , देखें [2], जो ईमेल शीर्षकों के लिए टाइमज़ोन निर्दिष्ट करने के अन्य तरीकों को अप्रचलित करता है)।

इसलिए, यदि आप इस प्रारूप में आपके समय क्षेत्र, चाहते हैं का उपयोग करें:

time.strftime("%z") 

[1] http://docs.python.org/2/library/datetime.html

[2] http://tools.ietf.org/html/rfc2822#section-3.3

[3] समय-क्षेत्र संक्षिप्त रूपों: http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations, केवल के लिए संदर्भ।

+0

यह 'tzinfo' ऑब्जेक्ट नहीं देता है। आप स्थानीय टाइमज़ोन के लिए वर्तमान यूटीसी ऑफ़सेट सेकंड्स की संख्या के रूप में प्राप्त कर सकते हैं: '-टाल्ज़ोन अगर डेलाइट और लोकटाइम()। Tm_isdst> 0 else -timezone' (सभी नाम' टाइम' मॉड्यूल से हैं)। – jfs

3

यह निम्न कोड स्निपेट सर्वर पर कॉन्फ़िगर किए गए टाइमज़ोन के बावजूद एक अलग टाइमज़ोन में समय देता है।

# pip install pytz tzlocal 

from tzlocal import get_localzone 
from datetime import datetime 
from pytz import timezone 

local_tz = get_localzone() 
local_datetime = datetime.now(local_tz) 

zurich_tz = timezone('Europe/Zurich') 
zurich_datetime = zurich_tz.normalize(local_datetime.astimezone(zurich_tz)) 
+1

का कोई कारण नहीं है, 'zurich_datetime = datetime.now (टाइमज़ोन (' यूरोप/ज़्यूरिख ') का उपयोग न करें)' यहां? बीटीडब्ल्यू, [.astimezone() '] के बाद' .normalize() 'को कॉल करना जरूरी नहीं है (https://answers.launchpad.net/pytz/+question/249229#6) – jfs

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