web-dev-qa-db-ja.com

Pythonで日時オブジェクトでタイムゾーンを使用するにはどうすればよいですか?

タイムゾーンで異なるタイムゾーンを適切に表すにはどうすればよいですか?次の例は、EDTが1時間進んでいることがわかっているため、myTimeZone()の減算をアンコメントできるためにのみ機能します。

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 __== '__main__':
    main()
40
jidar

タイムゾーンを使用する場合は、babelおよびpytzをお勧めします。内部のdatetimeオブジェクトを単純かつUTCで保持し、フォーマットのみのためにタイムゾーンに変換します。おそらくナイーブオブジェクト(タイムゾーン情報のないオブジェクト)が必要な理由は、多くのライブラリとデータベースアダプターがタイムゾーンを認識していないためです。

37
Armin Ronacher

Python標準ライブラリにはタイムゾーン情報が含まれていません。残念なことに、タイムゾーンデータはPythonよりもはるかに高速に変更されます。これにはサードパーティモジュールが必要です。通常の選択肢は pytz

10
Thomas Wouters

現在のローカルタイムゾーンでは、次を使用できます。

_>>> 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は、夏時間が現在有効でない場合はゼロになります(ただし、地域で夏時間の法律が最近変更された場合、これは正しくない場合があります)。

7
Carlos H Romano