2014-07-10 6 views
8

के संबंध में साप्ताहिक टाइमडेल्टस को कैसे जोड़ें I स्थानीयकृत डेटाटाइम ऑब्जेक्ट्स में सप्ताह (या दिन या महीने या वर्ष) जोड़ना या घटाना चाहते हैं। समस्या यह है कि, निष्क्रिय दृष्टिकोण के परिणामस्वरूप डेलाइट सेविंग टाइमज़ोन के कारण 1 घंटे की शिफ्ट हो जाएगी।डेलाइट सेविंग टाइमज़ोन

2014-03-27 12:00 सर्दी से ग्रीष्मकालीन समय में स्विच से ठीक पहले है। यदि मैं इस तारीख को एक सप्ताह का टाइमडेल्टा जोड़ता हूं, उदाहरण के लिए टाइमज़ोन यूरोप/बर्लिन में स्थानीयकृत, परिणाम 2014-04-03 13:00 होगा। मैं दिन का एक ही घंटे, 2014-04-03 12:00 चाहता हूं। मुझे एक समाधान मिला:

from datetime import datetime, timedelta 
import pytz 
my_tz = pytz.timezone("Europe/Berlin") 

def add_relativedelta(date, delta): 
    """ 
    Adds the given timedelta to the given date. Shifts in timezone offsets 
    will be removed. 
    """ 
    tz = date.tzinfo 
    result = tz.normalize(date + delta) 
    if result.utcoffset() != date.utcoffset(): 
     result = tz.normalize(date.utcoffset() - result.utcoffset() + result) 
    return result 

date = my_tz.localize(datetime(year=2014, month=3, day=27, hour=12, minute=0)) 
print """{} Original localized date (winter time) 
{} One week later (summer time) 
{} Date one week later preserving hour of day (summer time)""".format(date, 
        my_tz.normalize(date + timedelta(days=7)), 
        add_relativedelta(date, timedelta(days=7))) 


2014-03-27 12:00:00+01:00 Original localized date (winter time) 
2014-04-03 13:00:00+02:00 One week later (summer time) 
2014-04-03 12:00:00+02:00 Date one week later preserving hour of day (summer time) 

मैं सोच रहा था कि क्या अधिक सामान्य/बेहतर समाधान है। क्या कोई पुस्तकालय है जो इसे हल कर सकता है? यह एक बहुत आम मुद्दा प्रतीत होता है।

उत्तर

14

timedelta(days=7) का अर्थ है 712, 7*24 घंटों में - "सौर दिन" नहीं। यदि आप टाइमज़ोन-जागरूक डेटाटाइम में 7 दिन जोड़ते हैं, तो आपको 7 दिनों के बाद एक डेटाटाइम प्राप्त होगा - स्वतंत्र रूप से उस डेटाटाइम ने को समय क्षेत्र में दर्शाया है।

ऐसा लगता है कि आप वास्तव में चाहते हैं कि आपके द्वारा निर्दिष्ट समय पर डेल्टा लागू करना है, टाइमज़ोन विवरण को अनदेखा कर रहा है। अंतर पर ध्यान दें:

In [13]: print my_tz.normalize(my_tz.localize(dt) + delta) 
2014-04-03 13:00:00+02:00 

In [14]: print my_tz.normalize(my_tz.localize(dt + delta)) 
2014-04-03 12:00:00+02:00 

तो, यदि संभव हो, तो स्थानीयकरण से पहले डेटाटाइम पर डेल्टा लागू करें।

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