जब datetime.now(pytz_timezone)
विफल करता है?
जहां तक मैं कह सकता हूं, वहां कोई परिदृश्य नहीं है जहां यह असफल हो सकता है। datetime.now
पैरामीटर में पारित tzinfo
उदाहरण पर fromutc
फ़ंक्शन को आमंत्रित करता है। यूटीसी से स्थानीय समय के सभी रूपांतरण स्पष्ट हैं, इसलिए विफलता के लिए कोई अवसर नहीं है।
इसके अलावा, मूल कोड भी काम नहीं करता है।
d = est.normalize(EST)
यह normalize
है, जो एक datetime
लेने के लिए करना है के लिए एक ही पैरामीटर के रूप में एक स्ट्रिंग पारित करने के लिए दिखाई देता है। इस देता है:
AttributeError: 'str' object has no attribute 'tzinfo'
मेरा मानना है कि वे लिखने के लिए मतलब:
d = est.normalize(d.astimezone(est))
कहा, मुझे नहीं लगता उनके कोड के शब्दाडंबर ज्यादा मूल्य कहते हैं। आप बताया गया है, यह एक ही चरण में यह करने के लिए बस के रूप में आसान है:
d = datetime.now(est)
cpython source code for datetime.now
को देखते हुए, मैं जब एक tzinfo
वस्तु प्रदान की जाती है, यह कहता है कि उस वस्तु पर fromutc
विधि देख सकते हैं।
if (self != NULL && tz != Py_None) {
/* Convert UTC to tzinfo's zone. */
PyObject *temp = self;
self = _PyObject_CallMethodId(tz, &PyId_fromutc, "O", self);
Py_DECREF(temp);
}
फिर, pytz स्रोत में, मुझे लगता है कि fromutc
विधि अलग तरह से है कि क्या क्षेत्र pytz.UTC
है, या StaticTzInfo
, या DstTzInfo
का एक उदाहरण के आधार पर कार्यान्वित किया जाता है देखते हैं। सभी तीन मामलों में, इनपुट यूटीसी मूल्य से लक्ष्य समय क्षेत्र में परिवर्तन स्पष्ट है।यहाँ DstTzInfo
कार्यान्वयन है, जो तीन के और अधिक जटिल है:
def fromutc(self, dt):
'''See datetime.tzinfo.fromutc'''
if (dt.tzinfo is not None
and getattr(dt.tzinfo, '_tzinfos', None) is not self._tzinfos):
raise ValueError('fromutc: dt.tzinfo is not self')
dt = dt.replace(tzinfo=None)
idx = max(0, bisect_right(self._utc_transition_times, dt) - 1)
inf = self._transition_info[idx]
return (dt + inf[0]).replace(tzinfo=self._tzinfos[inf])
इस समय क्षेत्र के _utc_transition_times
से संक्रमण को खोजने के लिए है, तो वापस आ datetime
पर लागू प्रदर्शित होगी। इस दिशा में कोई अस्पष्टता नहीं है, इसलिए परिणाम बराबर होंगे।
इसके अलावा ध्यान देने योग्य, the datetime
docs में यह कहा गया है कि datetime.now
बुला के बराबर है:
tz.fromutc(datetime.utcnow().replace(tzinfo=tz))
pytz कि मैंने पहले से पता चला है में fromutc
के स्रोत को देखते हुए, मुझे यकीन है कि नहीं कि यह सिर्फ किसी भी अलग है कर रहा हूँ:
tz.fromutc(datetime.utcnow())
लेकिन या तो मामले में, मुझे नहीं लगता localize
और normalize
जरूरी हैं है।
उनका लक्ष्य परियोजना के मुख्य पृष्ठ पर उदाहरण देना है कि 'डेलोरियन' का उपयोग करने के तरीके को 'डेटाटाइम' और 'पायट्ज़' का उपयोग करने से क्लीनर है। यह एक बुरा उदाहरण है क्योंकि यह गलत कोड है और आपके उदाहरण से बेहतर तरीके से संभाला जा सकता है, लेकिन आपका उदाहरण मूल लक्ष्य को पूरा नहीं करता है। हो सकता है कि एक नया उदाहरण प्रस्तावित करें जो एक ऐसा मामला दिखाता है जहां 'स्थानीयकरण' और 'सामान्यीकृत' वास्तव में आवश्यक हैं और इसे 'डेलोरियन' के साथ आसानी से कैसे संभाला जा सकता है? – heenenee
मैंने डेलोरियन के साथ एक [मुद्दा] (https://github.com/myusuf3/delorean/issues/70) दायर किया, इसलिए उन्होंने एक [पुल अनुरोध] बनाया (https://github.com/myusuf3/delorean/pull/ 71/फाइलें) जो पहले उदाहरण को साफ करती हैं। (उन्होंने डेलोरियन उदाहरण भी साफ कर दिया।) –
@ हेनेनी: मेरा प्रश्न 'datetime.now (tz) 'के बारे में है: क्या आप हमेशा इसका उपयोग' est.normalize (utc 'के बजाय दिए गए समय क्षेत्र में वर्तमान समय को वापस करने के लिए कर सकते हैं .localize (datetime.uctnow())। astimezone (ईएसटी)) '। – jfs