web-dev-qa-db-fra.com

Comment utiliser les fuseaux horaires avec un objet datetime en python?

Comment représenter correctement un fuseau horaire différent dans mon fuseau horaire? L'exemple ci-dessous ne fonctionne que parce que je sais que EDT a une heure d'avance sur moi, donc je peux décommenter la soustraction de 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 __name__ == '__main__':
    main()
42
jidar

Je recommande babel et pytz lorsque vous travaillez avec des fuseaux horaires. Gardez vos objets datetime internes naïfs et en UTC et convertissez-les en fuseau horaire pour le formatage uniquement. La raison pour laquelle vous voulez probablement des objets naïfs (objets sans informations de fuseau horaire) est que de nombreuses bibliothèques et adaptateurs de base de données n'ont aucune idée des fuseaux horaires.

38
Armin Ronacher

La bibliothèque standard Python ne contient pas d'informations de fuseau horaire, car malheureusement les données de fuseau horaire changent beaucoup plus rapidement que Python. Vous avez besoin d'un module tiers pour cela; le choix habituel est pytz

10
Thomas Wouters

Pour le fuseau horaire local actuel, vous pouvez utiliser:

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

La valeur renvoyée est en secondes à l'ouest d'UTC (les zones à l'est d'UTC obtenant une valeur négative). C'est l'opposé de ce que nous aimerions réellement, d'où le * -1.

localtime().tm_isdst sera nul si l'heure d'été n'est actuellement pas en vigueur (bien que cela puisse ne pas être correct si une zone a récemment changé sa loi d'heure d'été).

7
Carlos H Romano