TL; DR;
_2016-01-01
_をDjango timezone
に変換する方法
フルバージョン:
フォームからクエリ文字列パラメーターを受け取り、その文字列を取得して、Djangoの日時フィルターとして使用します。問題は、文字列を日時に変換すると、認識される日時が作成されないため、タイムゾーンが異なるために数時間を失うことです。たぶん私は書式設定で自分を失っていますが、それを行うことができません。
私はpytzを使用しており、設定にも_USE_TZ = True
_を使用しています。
例:
_from datetime import date
# Example from what I receive as GET querystring parameter
start_date, end_date = '15-01-2016', '16-01-2016'
DATE_FORMAT = '%Y-%m-%d'
start_date = start_date.split('-')
start_date = date(int(start_date[2]), int(start_date[1]), int(start_date[0]))
sd_filter = start_date.strftime(DATE_FORMAT)
end_date = end_date.split('-')
end_date = date(int(end_date[2]), int(end_date[1]), int(end_date[0]))
ed_filter = end_date.strftime(DATE_FORMAT)
#query
my_list = MyModel.objects.filter(created_at__range=(sd_filter, ed_filter))
_
問題はフィルターにあります。 Django設定からのタイムゾーンにより、数時間を失っています。
PDATE:datetime.now()
を自分の時間に変換する必要はありません。文字列を日時に変換する必要があります。
タイムゾーン非対応Python Date
オブジェクトとデータベースのタイムゾーン対応DateTimeField
フィールドを比較しています。DateTime
オブジェクトを使用する方が直感的であり、これらはタイムゾーン対応にすることができます次のように簡単に:
_import datetime
import pytz
start_date = '15-01-2016'
end_date = '16-01-2016'
date_format = '%d-%m-%Y'
unaware_start_date = datetime.datetime.strptime(start_date, date_format)
aware_start_date = pytz.utc.localize(unaware_start_date)
unaware_end_date = datetime.datetime.strptime(end_date, date_format)
aware_end_date = pytz.utc.localize(unaware_end_date)
my_list = MyModel.objects.filter(created_at__range=(aware_start_date, aware_end_date))
_
これは、strptime()
を使用して_unaware_start_date
_および_unaware_end_date
_ DateTime
オブジェクトを作成します。次に、_pytz.utc.localize
_を使用してオブジェクトをタイムゾーンに対応させます(utc
を適切なタイムゾーンに置き換える必要があります)。
次に、タイムゾーン対応のDateTime
オブジェクト-_aware_start_date
_および_aware_end_date
_を使用できます。これらをフィルターに入力すると、望ましい結果が得られます。
私はこれが古いことを知っていますが、私もこの状況に入ったので役立つかもしれません:
Make_aware()の使用についてはどうですか?
from datetime import datetime
from Django.utils.timezone import make_aware
date = '22-05-2018'
aware = make_aware(datetime.strptime(date, '%d-%m-%Y'))
これはsettings.pyで指定されたTIME_ZONEを使用します