2008-09-22 67 views
38

如何在我的時區中正確表示不同的時區?下面的例子只是工作,因爲我知道,EDT是我提前一個小時,所以我可以取消myTimeZone()如何在python中使用datetime對象的時區?

import datetime, re 
from datetime import tzinfo 

class myTimeZone(tzinfo): 
    """docstring for myTimeZone""" 
    def utfoffset(self, dt): 
     return timedelta(hours=1) 

def myDateHandler(aDateString): 
    """u'Sat, 6 Sep 2008 21:16:33 EDT'""" 
    _my_date_pattern = re.compile(r'\w+\,\s+(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\:(\d+)\:(\d+)') 
    day, month, year, hour, minute, second = _my_date_pattern.search(aDateString).groups() 
    month = [ 
      'JAN', 'FEB', 'MAR', 
      'APR', 'MAY', 'JUN', 
      'JUL', 'AUG', 'SEP', 
      'OCT', 'NOV', 'DEC' 
    ].index(month.upper()) + 1 
    dt = datetime.datetime(
     int(year), int(month), int(day), 
     int(hour), int(minute), int(second) 
    )     
    # dt = dt - datetime.timedelta(hours=1) 
    # dt = dt - dt.tzinfo.utfoffset(myTimeZone()) 
    return (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0, 0, 0) 

def main(): 
    print myDateHandler("Sat, 6 Sep 2008 21:16:33 EDT") 

if __name__ == '__main__': 
    main() 
+0

看看[這個答案](http://stackoverflow.com/a/18646797/2697658)。希望能幫助到你! – juan 2013-09-05 22:19:58

+0

您的具體日期/時間格式可以使用`email.utils` stdlib包處理:[`ts = mktime_tz('Sat,6 Sep 2008 21:16:33 EDT'))`](http:// stackoverflow .com/a/23117071/4279) – jfs 2016-01-01 02:29:16

回答

9

Python標準庫的減法不包含時區信息,因爲不幸的時區數據的變化比Python快得多。你需要一個第三方模塊;通常的選擇是pytz

+1

這並不能解釋爲什麼標準庫不能處理-500。 – 2012-08-06 21:19:28

+5

這不是一個有效的原因。如果可用的話,標準庫可以使用正在運行的平臺上的資源,並且如果找不到時區歷史記錄,則會優雅地降級。 – 2012-09-24 14:17:03

37

我建議babelpytz時工作時區。保持您的內部日期時間對象天真和UTC,並轉換爲您的時區只格式。你可能想要天真的對象(沒有時區信息的對象)的原因是許多庫和數據庫適配器不知道時區。

7

對於當前的本地時區,你可以使用:

>>> import time 
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone 
>>> offset/60/60 * -1 
-9 

返回的值是在UTC秒西(與UTC的地區東得到一個負值)。這與我們真正喜歡它的方式是相反的,因此* -1

localtime().tm_isdst如果夏令時目前不生效,則該值爲零(儘管如果某個地區最近更改了夏令時法,這可能不正確)。

-2

我們熟悉從GMT(現在是UTC)截止的時區,但Python需要從西方切斷時區。我相信這就是爲什麼Python中存在負時區截斷的原因。

相關問題