2012-09-25 78 views
9

我有一個javascript日曆發送給我一個unixtimestamp。我在新加坡。我希望此時間戳被解釋爲新加坡時間戳,然後轉換爲utc與db進行比較。在時區django與日期時間的Unix時間戳

對於我自己的生活,我不知道如何告訴django這個時間戳是來自當前時區,新加坡。

當我做時間戳打印語句,它添加了8個小時的時間(這意味着Django的認爲我輸入的時間在UTC,並且它定位於新加坡上下文)

在許多其他事情,我想: start=datetime.datetime.fromtimestamp(int(start_date)).replace(tzinfo=get_current_timezone())

的起始日期爲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

+0

posix timestamp'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

我的答案是什麼取決於服務器的時區?此外,'pytz'的'tz.localize(dt)'與'tz.normalize(dt.replace(tzinfo = pytz.utc).astimezone(tz))'是相同的(在這種情況下):http:// pytz.sourceforge.net/#localized-times-and-date-arithmetic –

+2

FFUUU!啊,謝謝你!你是對的。我是個白癡。我的答案已更新,以提供實際正確的答案。 –

4

傳遞pytz tzinfo對象fromtimestamp()方法:

#!/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爲了比較 - 您可以按原樣使用它。

我不知道哪裏+06:55來自新加坡+08:00。

由於無效的.replace()調用,您將看到+06:55get_current_timezone()返回pytz.timezone("Asia/Singapore"),它具有可變的utc偏移量(它可能在不同的日期有不同的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.fromutc()允許tz爲給定的utc時間選擇正確的偏移量。