2016-01-29 4 views
8

मैंने इस पोस्ट को Is Django corrupting timezone-aware DateTimeField when saving it to the Database? देखा लेकिन यह विशेष रूप से पिट्ज़ और माइस्क्ल का उपयोग करता है और जहां मैं पीईटीजी का उपयोग नहीं करता और SQLite का उपयोग नहीं करता (इसमें इसका असर हो सकता है)।डीजेगो डेटाटाइफ़ील्ड टाइमज़ोन जागरूक सीईटी

मैं निम्नलिखित मॉडल

class ScheduleItem(models.Model): 
    work_date = models.DateTimeField('Work date') 

है और इस प्रकार मैं डेटा सम्मिलित करें:

from isoweek import Week 
from dateutil import parser 
from django.utils import timezone 

def foo() 
    year = 2016 #hardcoded for example purpose 
    wknr = 2 #hardcoded for example purpose 
    dateObj = parser.parse(Week(year, wknr).day(0).isoformat() + " 00:00:00") 
    print(dateObj) # 2016-01-11 00:00:00 as expected 
    final = timezone.make_aware(dateObj) 
    print(final) # 2016-01-11 00:00:00+01:00 as expected 
    return final 


workdate = foo() 
si = ScheduleItem(work_date=workdate) 
si.save() 

प्रिंट बयान मुझे सही उत्पादन देते हैं, लेकिन एक बार मैं डेटाबेस (SQLite) मैं में देखो देख 2016-01-10 23:00:00

मेरे Django सेटिंग्स कहना

TIME_ZONE = 'CET' 
USE_TZ = True 

पुन: प्राप्त करने डेटा मैं:

datetime.datetime(2016, 1, 10, 23, 0, tzinfo=<UTC>) 

क्यों यह किसी अन्य स्वरूप में डेटा संग्रहीत किया जाता है तो मैं निर्दिष्ट और क्यों Django बारे में पता समयक्षेत्र होना तय है कि अगर मैं वापस एक UTC समयज़ोन मिलता है? मेरा मतलब है प्रविष्टि से पहले datetime वस्तु का कहना है: datetime.datetime(2016, 1, 11, 0, 0, tzinfo=<DstTzInfo 'CET' CET+1:00:00 STD>)

अद्यतन -

मैं डेटाबेस Django प्रलेखन here में वर्णित के रूप पर TIME_ZONE की स्थापना करके इस बीच में चारों ओर एक काम मिल गया। यह मैं डेटाबेस में सही समय क्षेत्र/तिथि देता है, लेकिन उस दस्तावेज़ के अनुसार मैं यह आवश्यकता नहीं होनी चाहिए, क्योंकि मेरी डीबी Django

द्वारा किया जाता है

यह तीसरे पक्ष के डेटाबेस में datetimes की दुकान के साथ बातचीत की अनुमति देता है यूटीसी के बजाय स्थानीय समय। डीएसटी परिवर्तनों के आसपास के मुद्दों से बचने के लिए, आपको Django द्वारा प्रबंधित डेटाबेस के लिए यह विकल्प सेट नहीं करना चाहिए।

यह अभी भी मेरे लिए स्पष्ट नहीं है क्यों Django यूटीसी के लिए एक सीईटी समय क्षेत्र के साथ एक datetime वस्तु परिवर्तित करता है जब यह डेटाबेस में संग्रहीत करने के लिए, लेकिन बहुत चालाक सीईटी के लिए इसे वापस कन्वर्ट करने के लिए लाते समय नहीं है।

उत्तर

4

Django आंतरिक रूप से यूटीसी समय का उपयोग करता है। TIME_ZONE (https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-TIME_ZONE) "अपने विचारों और मॉडलों के लिए" का उपयोग किया जाएगा

आप 2016-01-11 00:00 CET के साथ शुरू किया है, जो 2016-01-10 23:00 UTC है! आपका डेटाटाइम सही ढंग से डेटाबेस में सहेजा गया था और बाद में बहाल किया गया था, इसलिए सबकुछ अपेक्षित के रूप में काम कर रहा है।

+0

अब मैं समझ सकता हूं और स्वीकार कर सकता हूं कि Django के ओआरएम 'यूएसE_TZ' और 'TIME_ZONE' के संयोजन के आधार पर डेटाबेस में यूटीसी में डेटाटाइम को परिवर्तित करने और संग्रहीत करने का ख्याल रखता है। हालांकि, उसी अनुभाग से "आपके सभी विचार और मॉडल स्वचालित रूप से इस समय क्षेत्र में संचालित होंगे" ऐसा नहीं हो रहा है। मॉडल/ओआरएम के माध्यम से डेटाटाइम को पुनर्प्राप्त करते समय मुझे यूटीसी मिलती है, सीईटी संस्करण नहीं, जैसा कि मेरी सेटिंग्स में दर्शाया गया है। निश्चित रूप से मैं जो भी प्राप्त किया उसे बदलने के लिए Django के 'timezone.localtime() 'का उपयोग कर सकता हूं, लेकिन यह बात नहीं है। यह आवश्यक संचालन के केवल आधा कर रहा है। – ixje

+0

वह अनुभाग थोड़ा और स्पष्ट हो सकता है: उपयोगकर्ता-सामना करने वाली जानकारी प्रदर्शित करते समय TIME_ZONE का उपयोग किया जाता है। इसे मानवकृत टेम्पलेट टैग का उपयोग करके आज़माएं, मेरा मानना ​​है कि आपको सीईटी समय प्रदर्शित होगा। – knite

+0

मैंने आपको बक्षीस/उत्तर देने का विकल्प चुना क्योंकि कम से कम इस प्रश्न के एक हिस्से का उत्तर दिया और मुझे आंतरिक लोगों के हिस्से को समझने की अनुमति दी। यह मेरे जागरूक डेटाटाइम ऑब्जेक्ट को पुनर्स्थापित क्यों नहीं करता है, यह एक Django डिज़ाइन पसंद हो सकता है और सवाल के दायरे के बाहर माना जा सकता है। – ixje

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