2011-12-26 59 views
22

我有一個包含類型DateTimeField字段的領域模型的Django應用程序。
我正在從網上以2008-04-10 11:47:58-05的格式提取數據。
我相信這個例子中的最後3個字符是時區。
如何保留DateTimeField中的數據,並且兩者之間是否存在簡單的轉換?將DateTimeField設置爲僅包含上述格式的字符串將引發ValidationError。解析的時間字符串成一個Django DateTimeField字段

謝謝!

回答

32

您可以使用

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

返回一個日期時間(可分配給DateTimeField字段)。

+0

這聽起來不錯,但在我的Python 2.6.5沒有datetime.parser或datetime.datetime.parser模塊(我得到一個ImportError)。我錯過了什麼? – user1094786 2011-12-26 16:26:10

+0

啊廢話!當然,我的意思是「dateutil」。發佈更新! – nisc 2011-12-26 18:14:15

+0

只是想知道,這是否工作? – nisc 2011-12-31 16:44:42

3

如果你使用Django的形式,你可以指定input_formatsDateField。見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>) 

把它轉換爲當沒有已知的權利時區,則使用從make_aware django.utils.timezone

所以,最後,你的分析器工具將是:

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

這應該是被接受的答案。 – 2014-10-06 23:07:40

+1

雖然我希望文檔能明確指出'格式良好'的日期!我希望這意味着RFC 1123,但它似乎不喜歡我的瀏覽器發送回... – 2014-11-18 11:21:15

+0

這個答案是不正確的在沒有返回時區感知日期時間,至少不會在1.8.4。你可以自己試試 'from django.utils import timezone,dateparse; timezone.is_aware(dateparse.parse_datetime( '2015年9月4日19點22分十七秒'))' 並且還看到在[源(https://docs.djangoproject.com/en/1.8/_modules/django/utils/dateparse /#parse_datetime)返回一個datetime.datetime。 – Jmills 2015-08-27 15:49:58

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