मुझे क्या करना है
मेरे पास एक टाइमज़ोन-अनजान डेटाटाइम ऑब्जेक्ट है, जिसके लिए मुझे अन्य टाइमज़ोन-जागरूक डेटाटाइम ऑब्जेक्ट्स के साथ तुलना करने में सक्षम होने के लिए टाइम ज़ोन जोड़ने की आवश्यकता है। मैं अपने पूरे आवेदन को इस एक विरासत मामले के लिए अनजान समयरेखा में परिवर्तित नहीं करना चाहता।
मैंने क्या कोशिश की है
सबसे पहले, समस्या को प्रदर्शित करने के लिए:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import pytz
>>> unaware = datetime.datetime(2011,8,15,8,15,12,0)
>>> unaware
datetime.datetime(2011, 8, 15, 8, 15, 12)
>>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
>>> aware
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> aware == unaware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
सबसे पहले, मैंने astimezone की कोशिश की:
>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>
यह वास्तव में आश्चर्यजनक नहीं है, क्योंकि यह वास्तव में रूपांतरण करने की कोशिश कर रहा है। एक बेहतर विकल्प तरह लग रहा था बदलें (अनुसार अजगर: कैसे datetime.today () है कि "समय क्षेत्र के बारे में पता" का मान प्राप्त करने के लिए ):
>>> unaware.replace(tzinfo=pytz.UTC)
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == aware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
>>>
लेकिन जैसा कि आप देख सकते हैं, प्रतिस्थापित करने से लगता है कि tzinfo सेट है, लेकिन ऑब्जेक्ट को अवगत नहीं कराएं। मैं इनपुट स्ट्रिंग को डॉक्टर करने के लिए वापस आने के लिए तैयार हूं, ताकि इसे पार्स करने से पहले एक टाइमज़ोन हो (मैं पार्सिंग के लिए डेटूटिल का उपयोग कर रहा हूं, अगर यह मायने रखता है), लेकिन यह अविश्वसनीय रूप से कुल्डी लगता है।
इसके अलावा, मैंने पायथन 2.6 और अजगर 2.7 दोनों में यह कोशिश की है, एक ही परिणाम के साथ।
प्रसंग
मैं कुछ डेटा फ़ाइलों के लिए एक पार्सर लिख रहा हूं। एक पुराना प्रारूप है जिसका मुझे समर्थन करने की आवश्यकता है जहां दिनांक स्ट्रिंग में टाइमज़ोन संकेतक नहीं है। मैंने डेटा स्रोत पहले ही तय कर लिया है, लेकिन मुझे अभी भी विरासत डेटा प्रारूप का समर्थन करने की आवश्यकता है। विरासत डेटा का एक बार रूपांतरण विभिन्न व्यावसायिक बीएस कारणों के लिए एक विकल्प नहीं है। सामान्य तौर पर, मुझे डिफ़ॉल्ट टाइमज़ोन को हार्ड-कोडिंग करने का विचार पसंद नहीं है, इस मामले में यह सबसे अच्छा विकल्प लगता है। मैं उचित विश्वास के साथ जानता हूं कि प्रश्न में सभी विरासत डेटा UTC में है, इसलिए मैं इस मामले में उस पर डिफ़ॉल्ट करने के जोखिम को स्वीकार करने के लिए तैयार हूं।
import datetime; datetime.datetime.now(datetime.timezone.utc)
tz
arg का उपयोग अधिक पठनीय होगा:datetime.datetime.now(tz=datetime.timezone.utc)
unaware.replace()
None
यदि यहunaware
वस्तु की गति को संशोधित कर रहा होता है तो वापस आ जाता है । आरईपीएल दिखाता है कि यहां.replace()
एक नईdatetime
वस्तु लौटती है।