2015-08-07 20 views
9

delorean docs दिखाने को इस तरह से किसी दिए गए समय क्षेत्रusing datetime में वर्तमान समय मिलता है:जब `datetime.now (pytz_timezone)` विफल रहता है?

from datetime import datetime 
from pytz import timezone 

EST = "US/Eastern" 
UTC = "UTC" 

d = datetime.utcnow() 
utc = timezone(UTC) 
est = timezone(EST) 
d = utc.localize(d) 
d = est.normalize(EST) 

और delorian आधारित कोड के साथ तुलना:

from delorean import Delorean 

EST = "US/Eastern" 

d = Delorean(timezone=EST) 

I believedatetime उदाहरण लिखा जाना चाहिए के रूप में:

from datetime import datetime 
import pytz 

eastern_timezone = pytz.timezone("US/Eastern") 
d = datetime.now(eastern_timezone) 

जो अधिक संक्षिप्त है।

क्या कोई ऐसा मामला है जब अंतिम कोड उदाहरण जारी रहता है, जबकि अंतिम कोड उदाहरण विफल रहता है?


अद्यतन:the current example:

from datetime import datetime 
import pytz 

d = datetime.utcnow() 
d = pytz.utc.localize(d) 

est = pytz.timezone('US/Eastern') 
d = est.normalize(d) 
return d 

अभी भी बहुत वर्बोज़ है।

प्रश्न चित्र खड़ा है: do you need the explicit round-trip via utc and tz.normalize() or can you use datetime.now(tz) instead?

+0

उनका लक्ष्य परियोजना के मुख्य पृष्ठ पर उदाहरण देना है कि 'डेलोरियन' का उपयोग करने के तरीके को 'डेटाटाइम' और 'पायट्ज़' का उपयोग करने से क्लीनर है। यह एक बुरा उदाहरण है क्योंकि यह गलत कोड है और आपके उदाहरण से बेहतर तरीके से संभाला जा सकता है, लेकिन आपका उदाहरण मूल लक्ष्य को पूरा नहीं करता है। हो सकता है कि एक नया उदाहरण प्रस्तावित करें जो एक ऐसा मामला दिखाता है जहां 'स्थानीयकरण' और 'सामान्यीकृत' वास्तव में आवश्यक हैं और इसे 'डेलोरियन' के साथ आसानी से कैसे संभाला जा सकता है? – heenenee

+1

मैंने डेलोरियन के साथ एक [मुद्दा] (https://github.com/myusuf3/delorean/issues/70) दायर किया, इसलिए उन्होंने एक [पुल अनुरोध] बनाया (https://github.com/myusuf3/delorean/pull/ 71/फाइलें) जो पहले उदाहरण को साफ करती हैं। (उन्होंने डेलोरियन उदाहरण भी साफ कर दिया।) –

+0

@ हेनेनी: मेरा प्रश्न 'datetime.now (tz) 'के बारे में है: क्या आप हमेशा इसका उपयोग' est.normalize (utc 'के बजाय दिए गए समय क्षेत्र में वर्तमान समय को वापस करने के लिए कर सकते हैं .localize (datetime.uctnow())। astimezone (ईएसटी)) '। – jfs

उत्तर

9

जब 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 जरूरी हैं है।

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