2009-11-05 71 views

回答

7
>>> import datetime 
>>> today = datetime.datetime.now() 
>>> insummer = datetime.datetime(2009,8,15,10,0,0) 
>>> from pytz import reference 
>>> localtime = reference.LocalTimezone() 
>>> localtime.tzname(today) 
'PST' 
>>> localtime.tzname(insummer) 
'PDT' 
>>> 
+4

['pytz'文檔說'pytz。參考'](http://pytz.sourceforge.net/#problems-with-localtime)只能用於測試*。 – jfs

+0

該警告適用於'reference.USTimeZone',它使用美國夏令時之前的2007年規則。然而,這裏使用的'reference.LocalTimezone'探測'time.localtime'的行爲,其正確性由系統庫維護。 'reference.LocalTimezone'給出了2007年美國規則變更之前和之後的正確DST轉換;我沒有測試過其他國家。 – rob

+2

@rob:**錯誤**。不要使用'LocalTimezone()'。 'pytz'提供*歷史*時區數據,而'time.timezone','time.altzone'(由'LocalTimezone()'使用)是常量,即它們最多反映*最新的時區定義。當地時區在過去/未來可能會有不同的utc偏移量,例如,在2010 - 2015年嘗試歐洲/莫斯科時區,看看您自己會發生什麼。 – jfs

2

time.timezone返回當前時區偏移

環境變量不能指望。還有一個datetime.tzinfo,如果你需要更復雜的結構。

+0

time.timezone()只是返回UTC的偏移量。我想要一個tzinfo對象。所以我可能會什麼功能: 1.定義一個對應於tzinfo對象的類 2. instanciate對象 3.返回它 –

+0

'datetime'文檔有一個例子,解釋了'tzinfo'的使用。 – SilentGhost

+0

'datetime.datetime.now()+ datetime.timedelta(seconds = time.timezone)'很好地完成了這個技巧。 – Baczek

0

也許嘗試:

import time

print time.tzname #OR time.tzname[time.daylight]

+0

將此與第一個答案進行比較,爲什麼是-1? –

+0

['time.daylight']表示當前時區是否具有DST。它並不表示DST是否有效。 'time.tzname'也不是'tzinfo'實例(它是一個字符串)。請參閱[如何獲取系統時區設置並將其傳遞給pytz.timezone?](http://stackoverflow.com/q/13218506/4279)以瞭解即使您將得到正確的tzname;這並不意味着你會找到當地的時區。請參閱[在Python中獲取計算機的utc偏移量](http://stackoverflow.com/a/3168394/4279),它演示了獲取當前utc偏移量的幾種方法。 – jfs

7

tzlocal module返回pytz時區工作在* nix和Win32:

from datetime import datetime 
from tzlocal import get_localzone # $ pip install tzlocal 

# get local timezone  
local_tz = get_localzone() 


print local_tz.localize(datetime(2012, 1, 15)) 
# -> 2012-01-15 00:00:00+04:00 # current utc offset 
print local_tz.localize(datetime(2000, 1, 15)) 
# -> 2000-01-15 00:00:00+03:00 # past utc offset (note: +03 instead of +04) 
print local_tz.localize(datetime(2000, 6, 15)) 
# -> 2000-06-15 00:00:00+04:00 # changes to utc offset due to DST 

注:這既考慮DST和非DST UTC時差的變化。

-1

我被問同樣的對自己說,我發現在[1]的答案:

看看節8.1.7:格式爲「%Z」(小寫,在Z大寫的回報也時區,而不是在4位數字格式,但在時區的縮寫,形式等的strftime在[3])返回的形式「+/- 4位數」,也就是在電子郵件報頭(參見RFC 2822的第3.3節標準,請參閱[2],該過程廢止了爲電子郵件標題指定時區的其他方式)。

所以,如果你想在這個格式的時區,使用方法:

time.strftime("%z") 

[1] http://docs.python.org/2/library/datetime.html

[2] http://tools.ietf.org/html/rfc2822#section-3.3

[3]時區縮寫:http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations,只爲參考。

+0

它不給'tzinfo'對象。您可以將本地時區的當前utc偏移量設置爲秒數:'-altzone if daylight and localtime()。tm_isdst> 0 else -timezone'(所有名稱均來自'time'模塊)。 – jfs

3

這下面的代碼段在不同的時區返回時間,而不管服務器上配置的時區的。

# pip install pytz tzlocal 

from tzlocal import get_localzone 
from datetime import datetime 
from pytz import timezone 

local_tz = get_localzone() 
local_datetime = datetime.now(local_tz) 

zurich_tz = timezone('Europe/Zurich') 
zurich_datetime = zurich_tz.normalize(local_datetime.astimezone(zurich_tz)) 
+1

有沒有理由,不要在這裏使用'zurich_datetime = datetime.now(timezone('Europe/Zurich'))'?順便說一句,[不必在'.astimezone()']之後調用'.normalize()'(https://answers.launchpad.net/pytz/+question/249229#6) – jfs

相關問題