2011-12-26 8 views
22

में एक डेटाटाइम स्ट्रिंग को पार्स करना मेरे पास एक मॉडल के साथ एक Django ऐप है जिसमें डेटटाइमफ़िल्फ़ प्रकार का एक फ़ील्ड है।
मैं 2008-04-10 11:47:58-05 के प्रारूप में वेब से डेटा खींच रहा हूं।
मुझे विश्वास है कि इस उदाहरण में पिछले 3 वर्ण टाइमज़ोन हैं।
मैं डेटटाइमफ़ील्ड में उस डेटा को कैसे संरक्षित कर सकता हूं, और क्या दोनों के बीच एक आसान रूपांतरण है? उपरोक्त प्रारूप की एक स्ट्रिंग को बस रखने के लिए डेटटाइमफ़िल्ल्ड को सेट करने से सत्यापन प्रमाणीकरण फेंकता है।एक Django डेटटाइमफ़िल्ल्ड

धन्यवाद!

उत्तर

32

आप

import dateutil.parser 
dateutil.parser.parse('2008-04-10 11:47:58-05') 

जो एक datetime (कि DateTimeField को सौंपा जा सकता) रिटर्न उपयोग कर सकते हैं।

+0

इस महान लगता है, लेकिन मेरी अजगर 2.6.5 में कोई datetime.parser है या datetime.datetime.parser मॉड्यूल (मुझे एक आयात त्रुटि मिलती है)। मैं क्या खो रहा हूँ? – user1094786

+0

एएच बकवास! बेशक मेरा मतलब है "डेट्यूटिल"। अद्यतन अद्यतन! – nisc

+0

बस सोच रहा है, क्या यह काम करता है? – nisc

3

यदि आप Django फॉर्म का उपयोग कर रहे हैं, तो आप input_formats को अपने DateField पर निर्दिष्ट कर सकते हैं। DateField documentation

देखें आप मनमाना तारीख की जानकारी पार्स करने के लिए चाहते हैं, तो आप parsedatetime की तरह कुछ का उपयोग करें और एक विधि है कि Django पार्स करने के लिए इससे पहले कि यह प्रमाणकों हिट कॉल को लागू कर सकते हैं। (कैसे सत्यापन कार्य नहीं करते और उन्हें सम्मिलित करने के लिए की एक अच्छी सारांश के लिए this SO answer देखें)

39

आप Django's implementation का भी उपयोग कर सकते हैं। मैं वास्तव में इसे पसंद करता हूं और केवल कुछ और उपयोग करता हूं, अगर Django का पार्सर प्रारूप को संभाल नहीं सकता है।

उदाहरण के लिए:

>>> from django.utils.dateparse import parse_datetime 
>>> parse_datetime('2016-10-03T19:00:00') 
datetime.datetime(2016, 10, 3, 19, 0) 
>>> parse_datetime('2016-10-03T19:00:00+0200') 
datetime.datetime(2016, 10, 3, 19, 0, tzinfo=<django.utils.timezone.FixedOffset object at 0x8072546d8>) 

यह सही समय क्षेत्र जब कोई भी जाना जाता है के लिए परिवर्तित करने के लिए, django.utils.timezone से make_aware का उपयोग करें।

तो अंततः, अपने पार्सर उपयोगिता होगा:

from django.utils.dateparse import parse_datetime 
from django.utils.timezone import is_aware, make_aware 

def get_aware_datetime(date_str): 
    ret = parse_datetime(date_str) 
    if not is_aware(ret): 
     ret = make_aware(ret) 
    return ret 
+2

यह स्वीकार्य उत्तर होना चाहिए। –

+1

मुझे यकीन है कि दस्तावेज़ों को निश्चित रूप से निर्दिष्ट करना होगा कि 'अच्छी तरह से स्वरूपित' तिथि क्या है! मैं उम्मीद करता हूं कि आरएफसी 1123 का मतलब है, लेकिन ऐसा लगता है कि मेरा ब्राउज़र वापस भेज रहा है ... –

+0

यह उत्तर सही नहीं है कि टाइमज़ोन जागरूक डेटाटाइम वापस नहीं किया गया है, कम से कम 1.8.4 में नहीं। आप अपने लिए यह कोशिश कर सकते हैं 'django.utils से आयात समय क्षेत्र, dateparse; timezone.is_aware (dateparse.parse_datetime ('2015-09-04 19:22:17')) ' और [स्रोत] में भी देखें (https://docs.djangoproject.com/en/1.8/_modules/django/utils/dateparse/# parse_datetime) कि एक datetime.datetime वापस आ गया है। – Jmills

6

मैं उपयोग कर रहे हैं इस:

from django.utils.timezone import get_current_timezone 
from datetime import datetime 
tz = get_current_timezone() 
dt = tz.localize(datetime.strptime(str_date, '%m/%d/%Y'))