2

私のアプリケーションではタイムゾーン ( 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フィルターが間違っていますか?

4

1 に答える 1

4

日付で正しいことをしているようです。ただし、時間によるフィルタリングなど、日付関連の機能に関するすべてのドキュメントには、次の注記が含まれています。

USE_TZ が True の場合、datetime フィールドはフィルタリング前に現在のタイム ゾーンに変換されます。

フィルタについては、日付だけでなく、整数や文字などの他のタイプのフィルタにも使用できるrangeため、このメモは存在しません。rangeつまり、必ずしも日時に対応しているわけではありません。

本質的に、問題は次のようになります: 時間がローカル タイムゾーンにある場合の「ユーザーとの対話」と、時間が UTC にある場合の内部との間の線引きはどこですか? あなたの場合、ユーザーが検索ボックスに入力して hour==3 を検索することを想像できます。たとえば、フォーム コードで hour==3 と同等の UTC の間の変換を行う必要があるということですか? これには特別な forms.HourField が必要です。または、値 (3) をクエリに直接入力する必要があります。ここでは、時間フィールドで検索しているため、変換が必要であることがわかっています。

これについては、ドキュメントに従う必要があります。

  • 特殊な日付/時刻フィルター機能を使用して日付/時刻フィールドに対してフィルター処理される値は、ユーザーのローカル タイム ゾーンにあるものとして扱われます。
  • 日付のフィルターを使用する場合、range時間の変換は行われないため、ユーザーが入力した現地時間の値を UTC に変換する必要があります。
于 2013-11-11T23:14:12.960 に答える