1 सवाल: UTC का बार-बार अनुवाद करने वाले Django को रोकें

पर बनाया गया सवाल Tue, Apr 9, 2019 12:00 AM

टाइमज़ोन मुझे पागल कर रहे हैं। हर बार जब मुझे लगता है कि मैं समझ गया हूं, किसी ने घड़ियों को बदल दिया है और मुझे एक दर्जन त्रुटियां मिली हैं। मुझे लगता है कि मैं अंत में उस बिंदु पर पहुंच गया हूं जहां मैं सही मूल्य जमा कर रहा हूं। मेरा समय timestamp with time zone है और मैं सहेजने से पहले टाइमजोन नहीं निकाल रहा हूँ।

TIME_ZONE = 'Europe/London'
USE_I18N = USE_L10N = USE_TZ = True

यहां dbshell के माध्यम से Postgres से एक विशिष्ट मूल्य है:

=> select start from bookings_booking where id = 280825;
2019-04-09 11:50:00+01

लेकिन यहां शेल_प्लस

के माध्यम से समान रिकॉर्ड है
Booking.objects.get(pk=280825).start
datetime.datetime(2019, 4, 9, 10, 50, tzinfo=<UTC>)

DAMMIT DJANGO, IT WASN'T A UTC TIME!

ये समय टेम्प्लेट /एडमिन /आदि में ठीक काम करते हैं, लेकिन जब मैं पीडीएफ और स्प्रेडशीट रिपोर्ट तैयार कर रहा हूं, तो यह सब गड़बड़ हो जाता है और मुझे अचानक मैन्युअल रूप से बार-बार स्थानीयकरण करना होगा। मैं नहीं देखता कि मुझे ऐसा क्यों करना है। डेटा स्थानीयकृत है। डेटाबेस और मुझे डेटा मिलने वाली क्वेरी के बीच क्या हो रहा है?

मैं इन मुद्दों से टकराता हूं, इसलिए अक्सर मुझे अपने आप पर बिल्कुल भरोसा नहीं होता है - एक वरिष्ठ देव के लिए काफी अनावश्यक - इसलिए मैं खुद को आपके चरणों में रखता हूं। मैं क्या कर रहा हूं माना करने के लिए?

    
3
  1. ध्यान दें कि डेटाबेस कनेक्शन का अपना एक timezone settings : "The PostgreSQL बैकएंड डेटेटाइम को 0600350991100101035062 के रूप में संग्रहीत करता है। व्यवहार में, इसका अर्थ है कि यह कनेक्शन के टाइम ज़ोन से UTC तक संग्रहण पर, और UTC से कनेक्शन के टाइम ज़ोन में डेटासेट को कनवर्ट करता है। पुनः प्राप्ति। " Django डेटाबेस कनेक्शन को timestamp with time zone पर सेट करता है । , जबकि संभवतः आपके dbshell कॉन्फ़िगरेशन कुछ और का उपयोग करता है।
    2019-04-09 22: 28: 51Z
    1 उत्तर                              1                         

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

    इसलिए जब आप psql में USE_TZ = True का उपयोग करके समय ऑब्जेक्ट प्राप्त कर रहे हैं, तो आप अपनी मशीन के स्थानीय समय क्षेत्र (उस समय क्षेत्र जहाँ आप psql चला रहे हैं) में समय वापस पा रहे हैं। यदि कोई "अमेरिका /न्यू_यॉर्क" में कोई समान क्वेरी चुनता है, तो उसे -04 टाइमस्टैम्प दिखाई देगी। यदि तिथि 2019-03-20 थी, तो आपने select देखा होगा क्योंकि उस तारीख को, यूरोप /लंदन और यूटीसी समान थे।

    जब 2019-03-20 10:50:00+00 के मूल्य को अजगर 0600350991100101035062 वस्तु के रूप में प्राप्त किया जाता है, तो Django हमेशा UTC मान प्राप्त करता है, क्योंकि:

      

    जागरूक डेटाटाइम ऑब्जेक्ट्स के साथ व्यवहार करना हमेशा सहज नहीं होता है। के लिये   उदाहरण के लिए, मानक डेटाटाइम कंस्ट्रक्टर के tzinfo तर्क   DST के साथ समय क्षेत्र के लिए मज़बूती से काम नहीं करता है UTC का उपयोग करना आम तौर पर है   सुरक्षित; यदि आप अन्य समय क्षेत्रों का उपयोग कर रहे हैं, तो आपको पाइट्ज़ की समीक्षा करनी चाहिए   प्रलेखन ध्यान से।

    इससे आपके पायथन कोड में इन डेटाटाइम ऑब्जेक्ट्स के साथ काम करना आसान हो जाता है: वे हमेशा UTC बार होते हैं।

    यदि आप इन मानों को PDF में प्रिंट करना चाहते हैं, तो टेम्पलेट रेंडरिंग के लिए Django द्वारा उपयोग की जाने वाली विधियों का उपयोग करें:

    DateTimeField

    यह डिफ़ॉल्ट टाइमज़ोन (या यदि आप 0600350991100101035062 एक अलग टाइमज़ोन में वर्तमान टाइमज़ोन )

    में डेटाटाइम प्रदान करता है।

    (*) नोट: आपको अपने db में सेव किए गए टाइमज़ोन को कोई अर्थ क्यों नहीं देना चाहिए और बस इसके बारे में सोचें जैसे कि यह सब यूटीसी है: यदि आप विभिन्न टाइमज़ोन में सर्वर चलाने के लिए थे, तो आप वास्तव में टाइमस्टैम्प को बचाने के लिए समाप्त हो सकते हैं। अलग-अलग टाइमज़ोन में। वे अभी भी सभी सही हैं (पूर्ण टाइमस्टैम्प) और किसी भी अन्य समयक्षेत्र में परिवर्तित किया जा सकता है। इसलिए मूल रूप से बचत के लिए इस्तेमाल किया जाने वाला समयक्षेत्र व्यर्थ है।

        
    2
    2019-04-10 09: 01: 48Z
    1. गंभीरता से स्पष्टीकरण की सराहना करते हैं लेकिन मुझे अभी भी यह विश्वास है कि एक पीजी डेटा प्रकार जो खुद को "टाइमस्टैम्प विद टाइम ज़ोन" कहता है, वास्तव में ऑफसेट नहीं रखता है, और यह नहीं है Django यहाँ मेरी गांड में कांटा जा रहा है। उस सभी ने कहा, मैं अपने सभी आउटपुट को टाइमज़ोन में भेजने की शुरुआत करूँगा ।emplate_localtime।
      2019-04-09 19: 43: 07Z
    2. उस अविश्वास को हवा देने के लिए, मैंने अपनी देव मशीन पर टाइमज़ोन को बदल दिया, पीजी को फिर से शुरू किया और मुझे अभी भी +01 का समय वापस मिल गया है। यह वास्तव में ऐसा नहीं लगता है कि Postgres सभी आंतरिक रूप से आयोजित UTC समय को सिस्टम-स्थानीय में परिवर्तित कर रहा है।
      2019-04-09 20: 42: 51Z
    3. Ok शायद मैं psql के आउटपुट में गलत हूं। लेकिन बाकी सब सही है। आप यह सुनिश्चित नहीं कर सकते हैं कि डेटाबेस में सहेजते समय किस समय क्षेत्र का उपयोग किया जाता है, इसलिए Django हमेशा अजगर वस्तुओं में UTC डेटाटाइम वापस देता है।
      2019-04-09 20: 52: 49Z
    4. मुझे इससे बाहर बात करने की अनुमति न दें। IRC पर किसी ने बस यही बात कही। पीजी डॉक्स एक ही बात कहते हैं ("utc all the time") यह सिर्फ निराशा होती है जब मैं सोचता हूं मैंने कुछ और देखा है। यह सभी प्रकार की छोटी-छोटी समस्याओं को भी जन्म देता है जिससे मुझे ऐसा लगता है कि मुझे अपने सभी भोले-भाले डिटाइम को यहां जमा करना चाहिए।
      2019-04-09 21: 15: 22Z
    5. यह वास्तव में आसान है यदि आप इसे इस तरह से सोचते हैं: डेटाबेस एक सही निरपेक्ष समय बचाता है; Django हमेशा यूटीसी-आधारित समय का उपयोग उन वस्तुओं में करता है जो इसके आसपास से गुजरती हैं; जब आप प्रतिपादन करते हैं, तो आप ऐसे कार्यों का उपयोग करते हैं जो आप जो भी समयक्षेत्र चाहते हैं उसे परिवर्तित करते हैं।
      2019-04-10 08: 57: 26Z
      datetime.datetime
स्रोत रखा गया यहाँ