6

Django 1.4の現在のベストプラクティスは、すべてをUTCで保存することであると理解しており、datetimeそれに同意します。また、すべてのタイムゾーンの会話は、次のようにテンプレートレベルで実行する必要があることも理解しています。

{% load tz %}

{% timezone "Europe/Paris" %}
    Paris time: {{ value }}
{% endtimezone %}

requestただし、すべてPythonでUTC時刻をの現地時間に変換する必要があります。Ajax(より具体的にはDajaxice )を使用してJSONで文字列を返すため、テンプレートタグを使用できません。

現在、これは私のコードですajax.py

# checked is from the checkbox's this.value (Javascript).
datetime = timezone.now() if checked else None

$ order_pk is sent to the Ajax function.
order = Order.objects.get(pk=order_pk)
order.time = datetime
order.save()

return simplejson.dumps({
    'error': False,
    'datetime': dateformat.format(datetime, 'F j, Y, P') if checked else 'None'
})

したがって、現在の時刻がApril 14, 2012, 5:52 p.m.EST時刻(私のローカルタイムゾーン)であっても、JSON応答はApril 14, 2012, 9:52 p.mUTC時刻であるため、を返します。

TIME_ZONEまた、Djangoはリクエストごとに呼び出されるテンプレート変数(実際にはrequest変数の一部ではない)を格納していることに気付きました。私の場合America/New_York、Djangoは各訪問者のローカルタイムゾーン(HTTPヘッダーに基づく)を把握できると思いますか?

とにかく、私の質問は2つあります。

  1. 訪問者のローカルタイムゾーンを取得するにはどうすればよいajax.pyですか?(おそらく、のような文字列引数として渡します{{ TIME_ZONE }}
  2. 訪問者のローカルタイムゾーンで、UTCtimezone.now()をローカルタイムゾーンに変換し、Djangoを使用して文字列として出力する方法はdateformat

編集: @agfの場合

timezone.now()UTC時刻を与えるUSE_TZ = True

# From django.utils.timezone
def now():
    """
    Returns an aware or naive datetime.datetime, depending on settings.USE_TZ.
    """
    if settings.USE_TZ:
        # timeit shows that datetime.now(tz=utc) is 24% slower
        return datetime.utcnow().replace(tzinfo=utc)
    else:
        return datetime.now()

とにかくdatetimeUTC以外のものに変換する方法はありますか?たとえばcurrent_time = timezone.now()、次にcurrent_time.replace(tzinfo=est)(EST =東部標準時)のようなことを行うことはできますか?

4

3 に答える 3

10

DjangoTimezonesのドキュメントを注意深く読む必要があります。

重要なポイントの1つ:

Djangoがユーザーのタイムゾーンを自動的に決定するために使用できるAccept-LanguageHTTPヘッダーに相当するものはありません。

ユーザーにタイムゾーンを尋ねるか、デフォルトを使用する必要があります。

また、次のことを確認する必要があります。

USE_TZ = True

あなたのsettings.py

タイムゾーンが決まったら、次のtzことができます。

from django.utils import timezone

timezone.activate(tz)

datetime = timezone.now() if checked else None

datetimeタイムゾーンでタイムゾーン対応オブジェクトを取得しますtz

于 2012-04-14T22:23:08.347 に答える
6

ブラウザはタイムゾーンを示すヘッダーをサーバーに送信しませんが、JavaScript環境現在のタイムゾーンを認識しています。

これには2つの重要な効果があります。サーバーは最初のリクエストで現在のタイムゾーンを見つけることができませんが TZオフセットを決定するJavaScriptコードを送信し、その情報をサーバーに返送して、ゾーン情報を取得できるようにすることができます。その時点以降の現在のセッションに関連付けられています。

ただし、さらに重要なのは、ブラウザのクライアント側で解釈されるJSONデータ内で時間値を送信する場合、ブラウザのタイムゾーンを知る必要がないことです。代わりに、ブラウザが事後に独自のタイムゾーン計算を実行できるように、JSON出力にタイムゾーンオフセットが存在することを確認するだけで済みます。

var now = new Date()
var offset_minutes = now.getTimezoneOffset()  # e.g. 240 for GMT-0400
于 2013-08-09T06:30:12.913 に答える
1

ユーザーのタイムゾーンが必要なので、これはJavascriptを使用してブラウザーで実行する必要があることは私には理にかなっています。

次のようなものをテンプレートに渡します。

{"t": str(obj.timestamp))

ここで、objは、タイムスタンプフィールドのタイプがDateTimeFieldであるdjangoモデルのインスタンスです。

テンプレート:

<div class="timestring">{{ t }}</div> 
...
<script>
  $('.timestring').each(function(){
    var d = new Date($(this).text());
    $(this).text(d.toLocaleDateString() + ", " + d.toLocaleFormat("%r (%Z)"));
  })
</script>

私の場合、これは次のようなものを出力します:2017年2月15日、午後5時22分24秒(PST)

関連ドキュメント:

于 2017-02-16T01:47:42.853 に答える