私のアプリケーションではタイムゾーン ( USE_TZ=True
) を使用し、コードで作成するすべての日付は UTCdatetime
オブジェクトを認識します (django.util.timezone.now
現在の日付と次のヘルパー関数を使用して、インスタンスのすべての日付が期待どおりであることを確認します:)
@classmethod
def asUTCDate(cls, date):
if not timezone.is_aware(date):
return timezone.make_aware(date, timezone.utc)
return date.replace(tzinfo=timezone.utc)
また、このスニペットを使用して、ナイーブ/アウェアな日付のチェックを強制しました(ドキュメントで提案されているように):
import warnings
warnings.filterwarnings(
'error', r"DateTimeField .* received a naive datetime",
RuntimeWarning, r'django\.db\.models\.fields')
私がこれまでに理解したように、これは正しい進め方です (これは django ドキュメントからの引用です: 「この問題の解決策は、コードで UTC を使用し、エンド ユーザーと対話する場合にのみ現地時間を使用することです。」 )、そして、私のアプリは日付を非常にうまく処理しているようです...しかし、Django 1.6を利用するモデルに対してフィルタを実装したところ__hour
、ユーザーのタイムゾーンに基づいて抽出を強制すると、結果は次のようになります:
django_datetime_extract('hour', "object"."date", Europe/Rome) = 15
しかし、期待していた結果の一部がセットに含まれていないため、これは私のクエリを壊しますが、 a を使用し__range
て日付を検索すると、期待どおりに機能するようです (範囲内の日付を持つオブジェクトが返されます)...私は、Django がフィルターのクエリでのみタイムゾーンを考慮していることを知りまし__hour
た...しかし、理由はわかりません...表示された日付がユーザー tz に従ってフォーマットされるテンプレートを除いて、どこでも UTC が使用されていると思っていましたが、そうではないかもしれません。私の質問は次のとおりです。私がタイムゾーンを扱う方法は正しいですか? __hour
フィルターが間違っていますか?