web-dev-qa-db-ja.com

Python string to Django timezone(aware datetime)

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()を自分の時間に変換する必要はありません。文字列を日時に変換する必要があります。

15
jarussi

タイムゾーン非対応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_を使用できます。これらをフィルターに入力すると、望ましい結果が得られます。

9
gtlambert

私はこれが古いことを知っていますが、私もこの状況に入ったので役立つかもしれません:

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を使用します

17