2012-02-26 13 views
9

मैं Django में एक फॉर्म बना रहा हूँ। मुझे एक इनपुट प्रकार फ़ील्ड रखना है, जो केवल डेटाबेस में टाइमज़ोन संग्रहीत करता है (जिसे किसी उपयोगकर्ता द्वारा फॉर्म में ड्रॉप डाउन सूची से चुना जाएगा)। मैं इस टाइमज़ोन मॉडल को बनाने के लिए कोई भी दृष्टिकोण नहीं ढूंढ पा रहा हूं और यह सहेजे गए टाइमज़ोन के अनुसार स्थानीय समय को कैसे वापस कर पाएगा। मैं क्षेत्र निम्नलिखित चुन लेकिन यह भी मिनट घंटे और दूसरे संग्रहीत करता भीDjango मॉडल में समय क्षेत्र सहेजें

timestamp = models.DateTimeField() 

ड्रॉप डाउन सूची के रूप में किया जाना चाहिए: ... GMT +5: 30 GMT +6: 00 ... और इसलिए पर।

उत्तर

11

न तो django और न ही पायथन आपके उपयोग के लिए टाइमज़ोन का एक सेट प्रदान करते हैं।

इसके लिए, आपको pytz जैसे अतिरिक्त मॉड्यूल की आवश्यकता होगी।

>>> import pytz 
>>> pytz.all_timezones ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara', 
'Africa/Asmera'.... 

आप उनकी दुकान एक CharField में समय क्षेत्र नाम कर सकते हैं: आप इस तरह सभी समय क्षेत्र की एक सूची प्राप्त कर सकते हैं।

वैसे, "जीएमटी +6: 00" द्वारा टाइमज़ोन चुनना एक अच्छा विचार नहीं है। उदाहरण के लिए, ईएसटी आमतौर पर जीएमटी के पीछे 5 घंटे होता है, लेकिन डेलाइट बचत समय के आसपास 2 सप्ताह के लिए, ऑफ़सेट अलग होता है। साथ ही, वर्ष के कुछ समय क्वींसलैंड में और न्यू साउथ वेल्स में से किसी के पास दोनों ही जीएमटी ऑफ़सेट होते हैं, लेकिन एनएसडब्ल्यू के पास डीएसटी और क्वींसलैंड नहीं है, इसलिए आधे साल तक उनके जीएमटी ऑफसेट अलग-अलग होते हैं। टाइमज़ोन सूचीबद्ध करने का एकमात्र सुरक्षित तरीका वास्तविक भौगोलिक टाइमज़ोन सूचीबद्ध करना है।

+0

मैंने कहीं तो पर अपने आवेदन sumbit करना चाहते हैं जब वह/वह चलाता है इस ऐप में इसके चल रहे वातावरण में पिटज़ होना चाहिए? –

4

जिस तरह से मैं यह करता हूं वह pytz मान्य टाइमज़ोन नामों का उपयोग कर रहा है।

class Location(models.Model): 
    .... 
    time_zone = models.CharField(max_length=100, blank=True, null=True, choices=TIMEZONES) # 64 min 
    .... 

सूचना मैं खाली & अशक्त सेट: मैं केवल लोगों को मैं की जरूरत है, यानी

TIMEZONES = (
    'Canada/Atlantic', 
    'Canada/Central', 
    'Canada/Eastern', 
    'Canada/Mountain', 
    'Canada/Pacific', 
) 

मैं तो एक स्थान वर्ग है जो इस तरह के रूप में एक चार फील्ड के रूप में समय क्षेत्र सेट है प्रतिबिंबित करने के लिए अपनी सूची समायोजित क्षेत्र को वैकल्पिक बनाने के लिए सही है। आगे के विचारों के लिए django-timezone-field fields.py पर एक नज़र डालें।

pytz के साथ अपने कोड में इसके उपयोग के लिए, मैं आयात समय क्षेत्र:

from pytz import timezone 
import datetime 
from locations.models import Location # my object that has the time_zone field 
loc = Location.objects.get(pk=1) #get existing location or your object that has time_zone field 
utc = pytz.utc 
some_utc_date = datetime.datetime(2002, 10, 27, 6, 0, 0).replace(tzinfo=utc) #tz aware 
some_date.astimezone(timezone(loc.time_zone)) 

बदलें datetime.datetime (2002, 10, 27, 6, 0, 0) datetime क्षेत्र है कि आपके स्थान से मेल खाती है साथ या विशिष्ट ऑब्जेक्ट जिसमें time_zone फ़ील्ड है। मेरे मामले में मैं अपने सभी दिनांक फ़ील्ड को एक मोंगोडीबी संग्रह में यूटीसी प्रारूप में संग्रहीत करता हूं। जब मैं डेटा पुनर्प्राप्त करता हूं और मानव पठनीय आउटपुट बनाना चाहता हूं, तो मैं आउटपुट में दिनांक दिखाने के लिए उपर्युक्त विधि का उपयोग करता हूं। आप टेम्पलेट्स में इसे संभालने के लिए एक कस्टम टैग भी बना सकते हैं। अधिक जानकारी के लिए pytz दस्तावेज़ देखें।

0

मुझे लगता है कि इसके बाद के संस्करण जवाब सब बहुत अच्छा है और सही हैं, लेकिन मैं मेरा यहाँ leve एक सरल उदाहरण के रूप में ...

class UserProfile(models.Model): 

    import pytz 
    TIMEZONES = tuple(zip(pytz.all_timezones, pytz.all_timezones)) 

    # ... 
    timezone = models.CharField(max_length=32, choices=TIMEZONES, 
    default='UTC') 
# ... 
संबंधित मुद्दे