2012-09-25 10 views
9

私にunixtimestampを送信しているjavascriptカレンダーがあります。私はシンガポールにいる。このタイムスタンプをシンガポールのタイムスタンプとして解釈し、dbとの比較のためにutcに変換します。タイムゾーン付きのdjangoでのUnixタイムスタンプのタイムゾーン

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

私は、タイムスタンプのprint文を実行すると、それは(DjangoはUTCでI入力の時間を考え、シンガポールのコンテキストにローカライズされていることを意味する)時間に8時間を追加し

他の多くのもののうち、 、私が試した: start=datetime.datetime.fromtimestamp(int(start_date)).replace(tzinfo=get_current_timezone())

START_DATEが、しかし

を(2012-01-01 00:00:00に変換)1325376000で、私はこのの出力を印刷するとき、私は2012年1月1日08を得ます:00:00 + 06:55シンガポールが+08:00のときに+06:55がどこから来るのか知りません。私は迷っています。

ありがとうございました。

settings.py:

TIME_ZONE = 'Asia/Singapore'

USE_TZ = True

+0

posixタイムスタンプ '1325376000'は' '2012-01-01 00:00:00 UTC + 0000''と' '2012-01-01 08:00:00 SGT + 0800''です。シンガポールではなぜそれが00:00:00でなければならないと思いますか? – jfs

答えて

13

あなたは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) 
+0

ありがとう!完璧に動作します。 – nknj

+0

私の答えのどの部分がサーバーのタイムゾーンに依存していますか?また、 'pyzz'の' tz.localize(dt) 'は、' 'tz.normalize(dt.replace(tzinfo = pytz.utc).astimezone(tz))' 'と同じです(この場合はhttp:// pytz.sourceforge.net/#localized-times-and-date-arithmetic –

+2

FFUUU!ああ、ありがとう!あなたが正しい。私はアホです。私の答えは実際の正解を与えるように更新されました。 –

4

fromtimestamp()メソッドにオブジェクトtzinfoのpytzを渡し:

#!/usr/bin/env python 
from datetime import datetime 
import pytz # $ pip install pytz 

tz = pytz.timezone("Asia/Singapore") 
print(datetime.fromtimestamp(1325376000, tz)) 
# -> 2012-01-01 08:00:00+08:00 

注:結果オブジェクトはタイムゾーンに対応しており:あなたはすなわち、他の意識DateTimeオブジェクトとそれを比較することができ、あなたはUTCに変換する必要はありません。比較のためにそのまま使用することができます。

シンガポールが+08:00のときに+06:55が来る場所はわかりません。

.replace()コールが無効であるため、+06:55が表示されます。 get_current_timezone()は、可変utcオフセットを持つpytz.timezone("Asia/Singapore")を返します(異なる日付で異なるutcオフセットを持つ可能性があります)。 .replace()をいくつかランダムに(実装に依存して)呼び出すと、tzinfoオブジェクトが使用されます。問題は.replace()メソッドはpytz.timezone("Asia/Singapore")が入力日付の正しいtzinfoを選択できないということです。

>>> list(tz._tzinfos.values()) 
[<DstTzInfo 'Asia/Singapore' MALT+7:00:00 STD>, 
<DstTzInfo 'Asia/Singapore' MALT+7:20:00 STD>, 
<DstTzInfo 'Asia/Singapore' JST+9:00:00 STD>, 
<DstTzInfo 'Asia/Singapore' SMT+6:55:00 STD>, 
<DstTzInfo 'Asia/Singapore' SGT+7:30:00 STD>, 
<DstTzInfo 'Asia/Singapore' MALT+7:30:00 STD>, 
<DstTzInfo 'Asia/Singapore' MALST+7:20:00 DST>, 
<DstTzInfo 'Asia/Singapore' LMT+6:55:00 STD>, 
<DstTzInfo 'Asia/Singapore' SGT+8:00:00 STD>] 

即ち、+06:55+0800両方がシンガポールの(異なった日に)有効です。そのため、.replace()はutcタイムゾーン自体(オフセットはゼロ、任意の日付では常に)のような一定のutcオフセットを持つタイムゾーンでのみ使用する必要があります。

fromtimestamp(,tz)メソッドは、tzが指定されたutc時間に対して正しいオフセットを選択できるように、内部的にtz.fromutc()を呼び出します。

関連する問題