2012-12-21 6 views
26

में एक बेवकूफ डेटाटाइम उदाहरण में टाइमज़ोन जोड़ने के लिए मुझे datetime मिला है जिसमें कोई टाइमज़ोन जानकारी नहीं है। अब मुझे टाइमज़ोन जानकारी मिल रही है और मैं टाइमज़ोन को मौजूदा डेटाटाइम इंस्टेंस में जोड़ना चाहता हूं, मैं कैसे कर सकता हूं?पायथन

d = datetime.datetime.now() 
tz = pytz.timezone('Asia/Taipei') 

कैसे datetime a में

उत्तर

47

उपयोग tz.localize(d) समय क्षेत्र की जानकारी tz जोड़ने के लिए उदाहरण स्थानीय बनाना। documentation से:

सबसे पहले pytz लाइब्रेरी द्वारा प्रदान की गई स्थानीयकरण() विधि का उपयोग करना है। यह एक अनुभवहीन datetime (कोई समय क्षेत्र की जानकारी के साथ datetime) स्थानीय बनाना प्रयोग किया जाता है:

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0)) 
>>> print(loc_dt.strftime(fmt)) 
2002-10-27 06:00:00 EST-0500 

आप नहीं उपयोग tz.localize() कर हैं, लेकिन datetime.replace() उपयोग करते हैं, संभावना है कि एक ऐतिहासिक ऑफसेट बजाय प्रयोग किया जाता है ; tz.localize() दिए गए दिनांक के लिए सही ऑफसेट प्रभावी में ले जाएगा। यूएस पूर्वी टाइमज़ोन डीएसटी शुरू और समाप्ति तिथियां समय के साथ बदल गई हैं, उदाहरण के लिए।

जब आप एक डाटाटाइम वैल्यू को स्थानीयकृत करने का प्रयास करते हैं जो संदिग्ध है क्योंकि यह गर्मी से शीतकालीन समय तक संक्रमण अवधि को पार करता है या इसके विपरीत, टाइमज़ोन से परामर्श किया जाएगा कि परिणामस्वरूप डेटाटाइम ऑब्जेक्ट में .dst() सही या गलत हो । आप .localize() के लिए is_dst कीवर्ड तर्क के साथ समय क्षेत्र के लिए डिफ़ॉल्ट ओवरराइड कर सकते हैं:

dt = tz.localize(naive, is_dst=True) 

या यहाँ तक कि is_dst=None की स्थापना द्वारा कुल मिलाकर चुनाव बंद। उस स्थिति में, या दुर्लभ मामलों में एक टाइमज़ोन के लिए कोई डिफ़ॉल्ट सेट नहीं है, एक संदिग्ध डेटाटाइम मान AmbiguousTimeError अपवाद उठाया जाएगा। is_dst ध्वज केवल डेटाटाइम मानों के लिए परामर्श किया जाता है जो अस्पष्ट हैं और अन्यथा अनदेखा किया जाता है।

अन्य तरीके से वापस जाने के लिए एक समय क्षेत्र अवगत वस्तु एक अनुभवहीन वस्तु को वापस कर देते हैं, का उपयोग .replace(tzinfo=None):

naivedt = awaredt.replace(tzinfo=None) 
+0

बिल्कुल सही समाधान, धन्यवाद। – waitingkuo

+0

क्या 'डेटाटाइम' से बेवकूफ 'डेटाटाइम 'प्राप्त करने का कोई सुविधाजनक तरीका है जिसमें tzinfo है? – waitingkuo

+4

@waitingkuo: 'डेटाटाइम' ऑब्जेक्ट पर '.replace (tzinfo = none) 'पर कॉल करें। वापसी मूल्य एक बेवकूफ 'डेटाटाइम 'उदाहरण है। –

2

आप जानते हैं कि अपने मूल datetime था "मापा" समय क्षेत्र आप कर रहे हैं में हैं इसमें जोड़ने की कोशिश कर रहे हैं, आप localize के बजाय replace का उपयोग कर सकते हैं (लेकिन शायद नहीं)।

# d = datetime.datetime.now() 
# tz = pytz.timezone('Asia/Taipei') 
d = d.replace(tzinfo=tz) 

जब इस अर्थ (दूसरा एक मुझे क्या हुआ) कर सकता है मैं 2 बार कल्पना कर सकते हैं:

  1. आपके सर्वर स्थान गलत समय क्षेत्र के लिए निर्धारित है और आप एक datetime सही करने के लिए कोशिश कर रहे हैं उदाहरण के लिए यह गलत टाइमज़ोन (और संभवतः बाद में इसे "सही" समय क्षेत्र में स्थानांतरित करने के बारे में जागरूक करके, इसलिए अब() की कीमतों की तुलना में आप इसकी तुलना कर रहे हैं (आपकी घड़ी, शायद)
  2. आप चाहते हैं एक time उदाहरण "टैग" करने के लिए (नहींdatetime) एक समय क्षेत्र (tzinfo) विशेषता के साथ ताकि विशेषता का उपयोग बाद में पूर्ण datetime उदाहरण बनाने के लिए किया जा सके।