2011-11-02 21 views
11

मैं वर्तमान में बैलेंड पर एक कैलेंडिंग सिस्टम के लिए काम कर रहा हूं जो बेवकूफ पायथन डेटाटाइम देता है। फ्रंट एंड काम करने का तरीका यह है कि उपयोगकर्ता विभिन्न कैलेंडर ईवेंट बनाता है, और फ्रंटेंड उनके द्वारा बनाए गए ईवेंट के बेवकूफ संस्करण को लौटाता है (उदाहरण के लिए, यदि उपयोगकर्ता 5 अक्टूबर, 2020 को 3:00 बजे से शाम 4:00 बजे तक चुनता है, तो फ्रंटेंड रिटर्न datetime.datetime (2020, 10, 5, 15, 0, 0) प्रारंभ और डेटाटाइम .टाटाइम (2011, 10, 5, 16, 0, 0) के अंत के रूप में।आप पाइथन में एक बेवकूफ डेटाटाइम से डीएसटी-जागरूक डेटाटाइम कैसे परिवर्तित करते हैं?

मुझे क्या करना है बेवकूफ डेटाटाइम लेने और इसे डेटाबेस में स्टोरेज के लिए यूटीसी में परिवर्तित करने के लिए। सिस्टम के प्रत्येक उपयोगकर्ता ने पहले से ही अपना टाइमज़ोन वरीयता निर्दिष्ट कर दी है, इसलिए बेवकूफ डेटाटाइम को उनके टाइमज़ोन वरीयता के समान टाइमज़ोन माना जाता है। जाहिर है कि डेटाटाइम्स को यूटीसी के सापेक्ष संग्रहीत किया जाए ताकि उपयोगकर्ता अपने टाइमज़ोन को बदल सकें, मौजूदा घटनाएं अभी भी सही समय पर प्रस्तुत की जाएंगी।

फ्रंटेंड मेरे नियंत्रण से बाहर है, इसलिए मैं जो डेटा प्राप्त कर रहा हूं उसे बदल नहीं सकता। डेटाबेस डिज़ाइन भी मेरे नियंत्रण से बाहर है, इसलिए मैं नहीं बदल सकता कि कौन सा डेटा संग्रहीत किया जा रहा है और कैसे।

import pytz 
def convert_to_UTC(naive_datetime, user_tz_preference): 
    user_datetime = naive_datetime.replace(tzinfo=user_tz_preference) 
    utc_datetime = user_datetime.astimezone(pytz.utc) 
समस्या मैं में डेलाइट सेविंग टाइम से संबंधित है दौड़ा

:

यहाँ लगभग दृष्टिकोण मैं अब तक ले लिया है है

>>> from datetime import datetime 
>>> import pytz 
>>> user_tz_preference = pytz.timezone('US/Pacific') 
>>> naive_datetime = datetime(2011, 10, 26, 12, 0, 0) 
>>> user_datetime = naive_datetime.replace(tzinfo=user_tz_preference) 
>>> user_datetime 
datetime.datetime(2011, 10, 26, 12, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>) 
>>> received_utc = user_datetime.astimezone(pytz.utc) 
>>> received_utc 
datetime.datetime(2011, 10, 26, 20, 0, tzinfo=<UTC>) 
>>> expected_utc = datetime(2011, 10, 26, 19, 0, tzinfo=pytz.utc) 
>>> expected_utc == received_utc 
False 

सूचना का उपयोग कर 'की जगह ले' समय क्षेत्र सेट तारीख के बावजूद पीडीटी के बजाय पीएसटी के लिए, जो 7 घंटे डीएसटी ऑफ़सेट की बजाय 8 घंटे की यूटीसी ऑफसेट देता है, इसलिए समय गलत तरीके से सहेजा जा रहा है।

बेवकूफ डेटाटाइम को सही पीडीटी (या अन्य टाइमज़ोन-रिश्तेदार डीएसटी) tzinfo में बदलने के लिए मेरे पास कौन से विकल्प हैं?

(साथ ही, कृपया ध्यान दें कि सभी उपयोगकर्ता एक समय क्षेत्र में रहते हैं जो डीएसटी को देखता है, या अलग-अलग समय पर स्विच करने वाले टाइमज़ोन में रहता है, ताकि सहेजने से पहले टाइमडेल्टा सुधार जैसे समाधान करने के लिए, मैं चाहता हूं यह जानना आवश्यक है कि टाइमज़ोन डीएसटी का समर्थन करता है, और किस तारीख पर यह स्विच हो जाता है)।

+0

http://www.enricozini.org/2009/debian/using-python-datetime/ की –

+0

संभव डुप्लिकेट [एक अनजान दिनांक समय क्षेत्र बनाने के लिए पाइथन में अवगत] (http://stackoverflow.com/questions/7065164/how-to-make-an-unaware-datetime-timezone-aware-in-python) – Pureferret

उत्तर

18

Pytz के localize समारोह कर सकते हैं: http://pytz.sourceforge.net/#localized-times-and-date-arithmetic

from datetime import datetime 
import pytz  

tz = pytz.timezone('US/Pacific') 
naive_dt = datetime(2020, 10, 5, 15, 0, 0) 
utc_dt = tz.localize(naive_dt, is_dst=None).astimezone(pytz.utc) 
# -> 2020-10-05 22:00:00+00:00 
+0

धन्यवाद। ऐसा लगता है कि मैं क्या देख रहा था। – Jay

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