2011-12-26 4 views
22

DateTimeField型のフィールドを含むモデルを持つDjangoアプリケーションがあります。
私は2008-04-10 11:47:58-05の形式でウェブからデータを引き出しています。
この例の最後の3文字はタイムゾーンであると思います。
DateTimeFieldでそのデータを保持する方法はありますか?また、2つの間に簡単な変換がありますか?上記のフォーマットの文字列を単純に含むようにDateTimeFieldを設定すると、ValidationErrorがスローされます。日時文字列をDjango DateTimeFieldに解析する

ありがとうございました!

答えて

32

を(良い検証の仕組みの概要とときにそれらを挿入するためthis SO answerを参照してください)。

+0

これは素晴らしいサウンドが、私のpython 2.6.5で何datetime.parserはありませんまたはdatetime.datetime.parserモジュール(私はImportErrorを取得します)。私は何が欠けていますか? – user1094786

+0

AHさん!もちろん、私は "デートゥル"を意味します。投稿が更新されました! – nisc

+0

これはうまくいくのですか? – nisc

3

Djangoフォームを使用している場合は、DateFieldinput_formatsを指定することができます。あなたは任意日付情報を解析するために欠けている場合は、あなたがparsedatetimeのようなものを使用し、Djangoはそれがバリを打つ前に解析を行うために呼び出すメソッドを実装することができDateField documentation

を参照してください。あなたは(それがDateTimeField型に割り当てることができます)日時を返します

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

を使用することができます

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

私は確かに指定されたドキュメントがまさに「整形された」日付であることを願っています!私はそれがRFC 1123を意味すると期待していますが、ブラウザが返信しているものが好きではないようです... –

+0

この回答は、少なくとも1.8.4ではなく、タイムゾーン対応の日時が返されないという点で正しくありません。あなたは自分でこれを試すことができます 'from django.utils import timezone、dateparse; timezone.is_aware(dateparse.parse_datetime( '2015-09-04 19:22:17')) ' また、[source](https://docs.djangoproject.com/ja/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'))