517 votes

Python: Comment faire pour obtenir une valeur de type datetime.aujourd'hui () "fuseau horaire"?

Je suis en train de soustraire une date de valeur à partir de la valeur de datetime.today() de calculer combien de temps il y a quelque chose a été. Mais il se plaint:

TypeError: can't subtract offset-naive and offset-aware datetimes

La valeur datetime.today() ne semble pas être le "fuseau horaire", tandis que mon autre valeur à la date de l'est. Comment puis-je obtenir une valeur de datetime.today() qui est le fuseau horaire courant? Maintenant, c'est de me donner l'heure en heure locale, qui se trouve être PST, c'est à dire UTC-8 heures. Pire des cas, est il possible que je peux entrer manuellement une valeur de timezone dans l' datetime objet renvoyé en datetime.today() et réglez-UTC-8? Bien sûr, l'idéal serait pour elle de connaître automatiquement le fuseau horaire.

Merci!

511voto

AndiDog Points 28417

Dans la bibliothèque standard, il n'y a pas de croix-plate-forme de manière à créer au courant de fuseaux horaires sans créer votre propre fuseau horaire de la classe.

Sur Windows, il y a win32timezone.utcnow(), mais cela fait partie de pywin32. Je voudrais plutôt vous suggérons d'utiliser le pytz de la bibliothèque, qui a une mise à jour de la base de données de plus de fuseaux horaires.

Le travail avec les fuseaux horaires peuvent être très délicat (lire la pytz de la documentation!), donc, vous pouvez plutôt souhaitez utiliser UTC tout au long de votre application. Vous pouvez obtenir la date/heure actuelle comme suit:

import pytz
from datetime import datetime
datetime.utcnow().replace(tzinfo = pytz.utc)

L'esprit que, datetime.today() et datetime.now() retour au local le temps, pas le temps UTC, donc l'application .replace(tzinfo = pytz.utc) d'entre eux ne serait pas correct.

Une autre belle façon de le faire est:

datetime.now(pytz.utc)

ce qui est un peu plus court et fait de même.

198voto

philfreo Points 12382

Obtenir l'heure actuelle, dans un fuseau horaire:

import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))

21voto

J.F. Sebastian Points 102961

Voici un stdlib solution qui fonctionne sur Python 2 et 3:

from datetime import datetime, time

now = datetime.now(utc) # timezone-aware datetime.utcnow()
today = datetime.combine(datetime.utcnow().date(), time()).replace(tzinfo=utc)

today est un courant datetime instance représentant le début de la journée (minuit) à l'UTC et l' utc est un tzinfo objet (exemple de la doc):

from datetime import tzinfo, timedelta

ZERO = timedelta(0)

class UTC(tzinfo):
    def utcoffset(self, dt):
        return ZERO

    def tzname(self, dt):
        return "UTC"

    def dst(self, dt):
        return ZERO

utc = UTC()

20voto

Dariusz Walczak Points 1126

Une autre méthode pour construire fuseau horaire conscient objet datetime représentant l'heure actuelle:

import datetime
import pytz

pytz.utc.localize( datetime.datetime.utcnow() )  

5voto

user225312 Points 22699

pytz est une bibliothèque Python qui permet la précision et de la croix-plate-forme de fuseau horaire calculs à l'aide de Python 2.3 ou supérieur.

Avec la stdlib, ce n'est pas possible.

Voir une question similaire sur DONC.

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