2010-01-18 15 views
23

मैं डेटाटाइम से बाहर आया था जो डेटाटाइम उदाहरण का टाइमज़ोन कैसे सेट करूं?'datetime.datetime' ऑब्जेक्ट्स 'tzinfo' की विशेषता लिखने योग्य नहीं है

जब यह पहली बार आता है तो यह यूटीसी में है। मैं इसे ईएसटी में बदलना चाहता हूं।

मैं कोशिश कर रहा हूँ, उदाहरण के लिए:

class Book(db.Model): 
    creationTime = db.DateTimeProperty() 

जब एक पुस्तक लिया गया है, मैं अपने tzinfo तुरंत सेट करना चाहते हैं:

book.creationTime.tzinfo = EST 

कहाँ I use this example मेरी ईएसटी वस्तु के लिए

हालांकि मुझे मिलता है:

 
attribute 'tzinfo' of 'datetime.datetime' objects is not writable 

मैंने कई उत्तरों देखे हैं जो pytz और python-dateutil की अनुशंसा करते हैं, लेकिन मुझे वास्तव में इस प्रश्न का उत्तर चाहिए।

उत्तर

38

datetime की वस्तुओं अपरिवर्तनीय हैं, ताकि आप उनकी विशेषताओं में से किसी को बदलने कभी नहीं - आप एक नई कुछ के साथ वस्तु विशेषताओं का एक ही है, और कुछ अलग है, और जो कुछ भी आप इसे करने के लिए आवंटित करने के लिए की जरूरत के लिए असाइन करें।

अर्थात, और आपके मामले में,

book.creationTime.tzinfo = EST 

के बजाय आप

book.creationTime = book.creationTime.replace(tzinfo=EST) 
+0

नोट: यह यूटीसी से ईएसटी टाइमज़ोन में परिवर्तित नहीं होता है (* "यह पहली बार यूटीसी में आता है। मैं इसे ईएसटी में बदलना चाहता हूं।" *)। समय वही रहता है। कन्वर्ट करने के लिए, 'book.creationTime.astimezone (EST)' का उपयोग किया जा सकता है। – jfs

0

आप जो चाहते हैं वह docs में ठीक है।

from datetime import tzinfo, timedelta, datetime 

ZERO = timedelta(0) 
HOUR = timedelta(hours=1) 
DSTSTART = datetime(1, 4, 1, 2) 
DSTEND = datetime(1, 10, 25, 1) 

def first_sunday_on_or_after(dt): 
    days_to_go = 6 - dt.weekday() 
    if days_to_go: 
     dt += timedelta(days_to_go) 
    return dt 

class USTimeZone(tzinfo): 

    def __init__(self, hours, reprname, stdname, dstname): 
     self.stdoffset = timedelta(hours=hours) 
     self.reprname = reprname 
     self.stdname = stdname 
     self.dstname = dstname 

    def __repr__(self): 
     return self.reprname 

    def tzname(self, dt): 
     if self.dst(dt): 
      return self.dstname 
     else: 
      return self.stdname 

    def utcoffset(self, dt): 
     return self.stdoffset + self.dst(dt) 

    def dst(self, dt): 
     if dt is None or dt.tzinfo is None: 
      # An exception may be sensible here, in one or both cases. 
      # It depends on how you want to treat them. The default 
      # fromutc() implementation (called by the default astimezone() 
      # implementation) passes a datetime with dt.tzinfo is self. 
      return ZERO 
     assert dt.tzinfo is self 

     # Find first Sunday in April & the last in October. 
     start = first_sunday_on_or_after(DSTSTART.replace(year=dt.year)) 
     end = first_sunday_on_or_after(DSTEND.replace(year=dt.year)) 

     # Can't compare naive to aware objects, so strip the timezone from 
     # dt first. 
     if start <= dt.replace(tzinfo=None) < end: 
      return HOUR 
     else: 
      return ZERO 

now = datetime.now() 
print now 
print now.tzinfo 

Eastern = USTimeZone(-5, 'Eastern', 'EST', 'EDT') 
now_tz_aware = now.replace(tzinfo=Eastern) 
print now_tz_aware 

उत्पादन:

2010-01-18 17:08:02.741482 
None 
2010-01-18 17:08:02.741482-05:00 
+2

कि शायद ही बहुत जानकारीपूर्ण है कोड करने के लिए किया है। आप datetime.replace (tzinfo = ...) का उपयोग करने के लिए कहकर बस इतना समझा सकते थे - लेकिन आपने यह समझाया नहीं है कि उसे वह tzinfo कैसे प्राप्त करना है, जिसे आपने बस एक ईएसटी/ईडीटी टाइमज़ोन हार्डकोड किया है। – Auspex

5

आप एक datetime कि ईएसटी में है, लेकिन इसकी tzinfo क्षेत्र सेट नहीं है, dt.replace(tzinfo=tz) का उपयोग समय को संशोधित करने के बिना एक tzinfo आवंटित करने के लिए मिल रहा है तो। (आपका डेटाबेस आपके लिए यह करना चाहिए।)

यदि आपको यूडीटी में डेटाटाइम प्राप्त हो रहा है, और आप इसे ईएसटी में चाहते हैं, तो आपको अस्थिमेज़ोन की आवश्यकता है। http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

अधिकांश मामलों में, आपका डेटाबेस यूडीटी में डेटा संग्रहित और लौटाया जाना चाहिए, और आपको प्रतिस्थापन का उपयोग करने की आवश्यकता नहीं है (संभवतः यूडीटी tzinfo असाइन करने के अलावा)।

+1

'यूडीटी' से आपका मतलब 'यूटीसी' है, सही? – Will

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