2011-12-26 44 views
22

Tôi có một ứng dụng Django với một mô hình có chứa một trường kiểu DateTimeField.
Tôi đang lấy dữ liệu từ web theo định dạng 2008-04-10 11:47:58-05.
Tôi tin rằng 3 ký tự cuối cùng trong ví dụ này là múi giờ.
Làm cách nào tôi có thể bảo toàn dữ liệu đó trong DateTimeField và có chuyển đổi dễ dàng giữa hai chế độ này không? Đặt DateTimeField để chỉ chứa một chuỗi định dạng trên ném một ValidationError.Phân tích chuỗi ngày giờ thành một Django DateTimeField

Cảm ơn bạn!

Trả lời

32

Bạn có thể sử dụng

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

nào trả về một datetime (có thể được gán cho DateTimeField).

+0

này âm thanh tuyệt vời, nhưng trong python của tôi 2.6.5 không có datetime.parser hoặc datetime.datetime.parser modules (Tôi nhận được một ImportError). Tôi đang thiếu gì? – user1094786

+0

AH crap! Tất nhiên tôi có nghĩa là "dateutil". Đã cập nhật bài đăng! – nisc

+0

Chỉ cần tự hỏi, điều này có hiệu quả không? – nisc

3

Nếu bạn đang sử dụng Biểu mẫu Django, bạn có thể chỉ định input_formats cho số DateField của mình. Xem DateField documentation

Nếu bạn đang muốn phân tích thông tin ngày tùy ý, bạn có thể sử dụng giống như parsedatetime và thực hiện một phương pháp mà Django gọi để thực hiện phân tích trước khi nó chạm vào xác nhận. (Xem this SO answer cho một bản tóm tắt tốt về cách kiểm chứng thực làm việc và khi để chèn chúng)

39

Bạn cũng có thể sử dụng Django's implementation. Tôi sẽ trong thực tế thích nó và chỉ sử dụng cái gì khác, nếu phân tích cú pháp của Django không thể xử lý các định dạng.

Ví dụ:

>>> 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>) 

Để có nó chuyển đổi ở múi giờ đúng khi không được biết đến, sử dụng make_aware từ django.utils.timezone.

Vì vậy, cuối cùng, tiện ích phân tích cú pháp của bạn sẽ là:

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

Đây phải là câu trả lời được chấp nhận. –

+1

Tôi chắc chắn muốn các tài liệu được chỉ định chính xác ngày tháng 'được định dạng tốt' là gì! Tôi mong đợi điều đó có nghĩa là RFC 1123, nhưng dường như không giống như những gì trình duyệt của tôi đang gửi lại ... –

+0

Câu trả lời này không chính xác trong đó thời gian nhận biết múi giờ không được trả lại, ít nhất là không phải trong 1.8.4. Bạn có thể thử điều này cho chính mình 'từ django.utils múi giờ nhập, ngày tháng; timezone.is_aware (dateparse.parse_datetime ('2015-09-04 19:22:17')) ' và cũng thấy trong [source] (https://docs.djangoproject.com/en/1.8/_modules/django/utils/dateparse/# parse_datetime) rằng một datetime.datetime được trả về. – Jmills

6

Tôi đã sử dụng này:

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')) 
Các vấn đề liên quan