22

unixtimestamp を送信する JavaScript カレンダーがあります。私はシンガポールにいます。このタイムスタンプをシンガポールのタイムスタンプとして解釈し、データベースとの比較のために utc に変換したいと考えています。

私自身、このタイムスタンプが現在のタイムゾーンであるシンガポールからのものであることをdjangoに伝える方法を理解することはできません。

タイムスタンプの print ステートメントを実行すると、時刻に 8 時間が追加されます (つまり、django は時刻を utc で入力し、それをシンガポールのコンテキストにローカライズしていると考えます)。

他の多くのことの中で、私は試しました: start=datetime.datetime.fromtimestamp(int(start_date)).replace(tzinfo=get_current_timezone())

start_date は 1325376000 です (これは 2012-01-01 00:00:00 に変換されます)

ただし、この出力を印刷すると、2012-01-01 08:00:00+06:55 になります。シンガポールが +08:00 のときに +06:55 がどこから来ているのかもわかりません。私はとても迷っています。

ご協力いただきありがとうございます。

settings.py:

TIME_ZONE = 'Asia/Singapore'

USE_TZ = True

4

3 に答える 3

30

上記のすべてのメソッドは有効ですが、「django のような」ものではありません。これは、django プログラマーがどのように行うかの簡単な例です。

from datetime import datetime

from django.utils.timezone import make_aware


# valid timestamp
value = 1531489250 
# you can pass the following obj to a DateTimeField, when your settings.USE_TZ == True
datetime_obj_with_tz = make_aware(datetime.fromtimestamp(value))

全体の概要を把握するには、 Django github timezone モジュールのその他のユーティリティを参照してください...

于 2018-07-16T13:50:06.410 に答える
27

あなたがpytzインストールされていると仮定します:

from datetime import datetime
import pytz
local_tz = pytz.timezone("Asia/Singapore") 
utc_dt = datetime.utcfromtimestamp(timestamp).replace(tzinfo=pytz.utc)
local_dt = local_tz.normalize(utc_dt.astimezone(local_tz))

例えば:

>>> from datetime import datetime
>>> import pytz
>>> local_tz = pytz.timezone("Asia/Singapore")
>>> utc_dt = datetime.utcfromtimestamp(1325376000).replace(tzinfo=pytz.utc)
>>> utc_dt
datetime.datetime(2012, 1, 1, 0, 0, tzinfo=<UTC>)
>>> local_dt = local_tz.normalize(utc_dt.astimezone(local_tz))
>>> local_dt
datetime.datetime(2012, 1, 1, 8, 0, tzinfo=<DstTzInfo 'Asia/Singapore' SGT+8:00:00 STD>)
>>> local_dt.replace(tzinfo=None)
datetime.datetime(2012, 1, 1, 8, 0)
于 2012-09-25T19:30:58.260 に答える