44 votes

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 qu'EST, j'ai une heure d'avance sur moi, je peux donc 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()
 

39voto

Armin Ronacher Points 16894

Je recommande babel et pytz lorsque l'on travaille avec les fuseaux horaires. Gardez votre intérieur datetime objets naïfs et en heure UTC et convertir pour votre fuseau horaire pour que la mise en forme. La raison pour laquelle vous voudrez probablement naïve des objets (des objets sans les informations de fuseau horaire), c'est que beaucoup de bibliothèques de base de données et cartes n'ont aucune idée sur les fuseaux horaires.

11voto

Thomas Wouters Points 38811

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

7voto

chromano Points 119

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 exprimée en secondes à l'ouest de UTC (les zones situées à l'est de UTC obtenant une valeur négative). C’est le contraire de ce que nous aimerions réellement, d’où le * -1 .

localtime().tm_isdst sera égal à zéro si l'heure d'été n'est pas en vigueur (bien que cela puisse ne pas être correct si une zone a récemment changé de loi sur l'heure d'été).

-3voto

MAYCHU.NET Points 11

Nous connaissons bien le fuseau horaire coupé de l’heure GMT (maintenant le temps UTC), mais Python prend le fuseau horaire coupé de l’ouest. C'est pourquoi il y a des seuils de fuseau horaire négatifs en Python, je crois.

-3voto

Jarek Przygódzki Points 1215

Comment obtenir le fuseau horaire local? Il existe des solutions spécifiques au système d'exploitation (par exemple, / etc / timezone, le support des fuseaux horaires win32 de pywin32), mais pas une plate-forme indépendante à ma connaissance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X