2011-07-23 12 views
6

एक विशिष्ट बैंक की दुनिया के सभी प्रमुख शहरों में शाखाएं हैं। वे सभी स्थानीय समय 10:00 बजे खुलते हैं। यदि डीएसटी का उपयोग करने वाले टाइमज़ोन के भीतर, तो निश्चित रूप से स्थानीय उद्घाटन समय भी डीएसटी-समायोजित समय का पालन करता है। तो मैं स्थानीय समय से यूटीसी समय पर कैसे जा सकता हूं।पायथन - डीएसटी-समायोजित स्थानीय समय से यूटीसी

तर्क:

क्या मैं जरूरत है एक समारोह to_utc(localdt, tz) इस तरह है

  • localdt: स्थानीयसमय, अनुभवहीन datetime वस्तु के रूप में, डीएसटी-समायोजित
  • TZ: TZ-प्रारूप में समय क्षेत्र, जैसे 'यूरोप/बर्लिन'

रिटर्न:

  • datetime वस्तु, यूटीसी में, समय क्षेत्र अवगत

संपादित करें:

सबसे बड़ी चुनौती है कि क्या स्थानीय समय पता लगाने के लिए है डीएसटी के साथ एक अवधि में है, जिसका अर्थ है कि यह डीएसटी समायोजित है।

'यूरोप/बर्लिन' जो गर्मियों में +1 डीएसटी है के लिए:

  • जनवरी 1st 10:00 => जनवरी 1st 09:00 यूटीसी
  • जुलाई 1st 10:00 => 1st जुलाई 08:00 यूटीसी

'अफ्रीका/लागोस' जो कोई डीएसटी है के लिए:

  • जनवरी 1st 10:00 => जनवरी 1st 09:00 यूटीसी
  • जुलाई 1 10:00 1 => जुलाई 09:00 यूटीसी
+0

ख़तरा: 27 मार्च 2011 01:00 पर, घड़ियों 02:00 के लिए आगे कर दिया गया। तो 01:00 और 02:00 के बीच अंतराल अमान्य है। 30 अक्टूबर 2011 01:00 बजे, घड़ियों को 00:00 पर वापस सेट किया जाएगा। तो 00:00 और 01:00 के बीच अंतराल संदिग्ध है। –

+1

'pytz' वर्णन करता है कि डीएसटी संक्रमण किसी भी टाइमज़ोन के लिए काम नहीं करता है जिसमें एक है। यदि समय-समय पर सहायता के लिए विशेष रूप से बनाए गए पैकेज का समर्थन नहीं होता है, तो यह आपके लिए सही तरीके से करने के लिए बहुत अधिक काम है। आपको लगभग सही के लिए बसना होगा। – agf

उत्तर

7

pytz का उपयोग करना, और विशेष रूप से अपने localize method:

import pytz 
import datetime as dt 

def to_utc(localdt,tz): 
    timezone=pytz.timezone(tz) 
    utc=pytz.utc 
    return timezone.localize(localdt).astimezone(utc) 

if __name__=='__main__': 
    for tz in ('Europe/Berlin','Africa/Lagos'): 
     for date in (dt.datetime(2011,1,1,10,0,0), 
       dt.datetime(2011,7,1,10,0,0), 
       ): 
      print('{tz:15} {l} --> {u}'.format(
       tz=tz, 
       l=date.strftime('%b %d %H:%M'), 
       u=to_utc(date,tz).strftime('%b %d %H:%M %Z'))) 

पैदावार

Europe/Berlin Jan 01 10:00 --> Jan 01 09:00 UTC 
Europe/Berlin Jul 01 10:00 --> Jul 01 08:00 UTC 
Africa/Lagos Jan 01 10:00 --> Jan 01 09:00 UTC 
Africa/Lagos Jul 01 10:00 --> Jul 01 09:00 UTC 
+0

ग्रेट, धन्यवाद :) –

+2

नोट: कुछ स्थानीय समय संदिग्ध हैं। हालांकि यह संभावना नहीं है कि एक समय डीएसटी संक्रमण के दौरान एक बैंक खुलता है; आप '.localize()' के लिए 'is_dst = none' पैरामीटर का उपयोग करने के लिए इसका उपयोग कर सकते हैं। – jfs

1
from datetime import datetime, tzinfo, timedelta 

class GMT1(tzinfo): 
    def utcoffset(self, dt): 
     return timedelta(hours=1) 
    def dst(self, dt): 
     return timedelta(0) 
    def tzname(self,dt): 
     return "Europe/Prague" 
year, month, day = 2011, 7, 23 
dt = datetime(year, month, day, 10) 

class UTC(tzinfo): 
    def utcoffset(self, dt): 
     return timedelta(0) 
    def dst(self, dt): 
     return timedelta(0) 
    def tzname(self,dt): 
     return "UTC" 

def utc(localt, tz): 
    return localt.replace(tzinfo=tz).astimezone(UTC()) 

print utc(dt, GMT1()) 

नया संस्करण। यह वही करता है जो आप चाहते हैं - एक बेवकूफ डेटाटाइम और एक टाइमज़ोन लेता है और एक यूटीसी डेटाटाइम देता है।

+0

आपका समाधान मुख्य चुनौती को हल करने में विफल रहता है: डीएसटी का स्वचालित संचालन। –

+0

मुझे यकीन नहीं है कि मैं समझता हूं। यदि आपके द्वारा उपयोग किए जाने वाले 'tzinfo' में डीएसटी के लिए' timedelta' है, तो इसे स्वचालित रूप से 'utcnow() 'द्वारा नियंत्रित किया जाना चाहिए? – agf

+0

मुझे अब मिल गया है। मेरा जवाब अपडेट किया गया। – agf