J'ai une instance de datetime python qui a été créée à l'aide de datetime.utcnow () et qui a persisté dans la base de données.
Pour l'affichage, je voudrais convertir l'instance datetime récupérée de la base de données en datetime locale en utilisant le fuseau horaire local par défaut (c'est-à-dire, comme si le datetime avait été créé en utilisant datetime.now ()).
Comment puis-je convertir le datetime UTC en datetime local en utilisant uniquement la bibliothèque standard Python (par exemple, aucune dépendance pytz)?
Il semble qu'une solution serait d'utiliser datetime.astimezone (tz), mais comment obtiendriez-vous le fuseau horaire local par défaut?
python
datetime
timezone
python-datetime
Nitro Zark
la source
la source
Réponses:
Dans Python 3.3+:
En Python 2/3:
Utilisation
pytz
(à la fois de Python 2/3):Exemple
Production
Python 3.3 Python 2 PytzRemarque: il prend en compte l'heure d'été et le récent changement de décalage utc pour le fuseau horaire MSK.
Je ne sais pas si les solutions non pytz fonctionnent sous Windows.
la source
.normalize()
car le fuseau horaire source.astimezone()
est UTC.TypeError: replace() takes no keyword arguments
en essayant la solution pytz.local_dt.replace(tzinfo=None).astimezone(tz=timezone.utc)
Vous ne pouvez pas le faire uniquement avec la bibliothèque standard car la bibliothèque standard n'a pas de fuseau horaire. Vous avez besoin de pytz ou dateutil .
Ou bien, vous pouvez le faire sans pytz ni dateutil en implémentant vos propres fuseaux horaires. Mais ce serait idiot.
la source
Vous ne pouvez pas le faire avec une bibliothèque standard. En utilisant le module pytz, vous pouvez convertir n'importe quel objet datetime naïf / conscient vers n'importe quel autre fuseau horaire. Voyons quelques exemples utilisant Python 3.
Pour convertir un objet naïf dans n'importe quel autre fuseau horaire, vous devez d'abord le convertir en objet datetime conscient . Vous pouvez utiliser la
replace
méthode pour convertir un objet datetime naïf en un objet datetime conscient . Ensuite, pour convertir un objet datetime conscient en un autre fuseau horaire, vous pouvez utiliserastimezone
method.La variable
pytz.all_timezones
vous donne la liste de tous les fuseaux horaires disponibles dans le module pytz.Étant donné que la
now
méthode renvoie la date et l'heure actuelles, vous devez d'abord rendre compte du fuseau horaire de l'objet datetime. Lalocalize
fonction convertit un objet datetime naïf en un objet datetime sensible au fuseau horaire. Ensuite, vous pouvez utiliser laastimezone
méthode pour le convertir en un autre fuseau horaire.la source
Je pense que je l'ai compris: calcule le nombre de secondes depuis l'époque, puis convertit en un timzeone local en utilisant time.localtime, puis convertit la structure de temps en une date / heure ...
Il applique correctement l'heure d'été / hiver:
la source
utctotimestamp(utc_dt) -> (seconds, microseconds)
de votre code pour plus de clarté, voir l' implémentation de Python 2.6-3.xS'appuyant sur le commentaire d'Alexei. Cela devrait également fonctionner pour l'heure d'été.
la source
La bibliothèque Python standard n'est livrée avec aucune
tzinfo
implémentation. J'ai toujours considéré cela comme une lacune surprenante du module datetime.La documentation de la classe tzinfo contient quelques exemples utiles. Recherchez le gros bloc de code à la fin de la section.
la source
os
module aurait pu en fournir un pour l'heure locale en fonction des fonctions du système d'exploitation.Python 3.9 ajoute le
zoneinfo
module, donc maintenant cela peut être fait comme suit (stdlib uniquement):L'Europe centrale a 1 ou 2 heures d'avance sur UTC, donc
local_aware
:comme
str
:Windows n'a pas de base de données de fuseaux horaires système, donc ici un package supplémentaire est nécessaire:
Il existe un backport pour permettre l'utilisation dans Python 3.6 à 3.8 :
Ensuite:
la source
zoneinfo
ici - voir la première partie de la réponse de jfs (la partie Python3.3 +) ;-)ZoneInfo('localtime')
c'est beaucoup plus clair quetz=None
(après tout, on pourrait s'attendretz=None
à supprimer le fuseau horaire ou à retourner UTC plutôt que l'heure locale).Une manière simple (mais peut-être imparfaite) qui fonctionne dans Python 2 et 3:
Son avantage est qu'il est trivial d'écrire une fonction inverse
la source
time.timezone
cela ne prend pas en compte l'heure d'été.Le moyen le plus simple que j'ai trouvé est d'obtenir le décalage horaire de l'endroit où vous vous trouvez, puis de le soustraire de l'heure.
Cela fonctionne pour moi, en Python 3.5.2.
la source
Voici une autre façon de changer le fuseau horaire au format datetime (je sais que j'ai gaspillé mon énergie là-dessus mais je n'ai pas vu cette page donc je ne sais pas comment) sans min. et sec. car je n'en ai pas besoin pour mon projet:
la source
C'est une manière terrible de le faire mais cela évite de créer une définition. Il remplit l'exigence de s'en tenir à la bibliothèque de base Python3.
la source
Utilisez timedelta pour basculer entre les fuseaux horaires. Tout ce dont vous avez besoin est le décalage en heures entre les fuseaux horaires. Pas besoin de jouer avec les limites des 6 éléments d'un objet datetime. timedelta gère aussi facilement les années bissextiles, les siècles bissextiles, etc. Vous devez d'abord
Alors si
offset
est le delta du fuseau horaire en heures:timeout = timein + timedelta(hours = offset)
où timein et timeout sont des objets datetime. par exemple
timein + timedelta(hours = -8)
convertit de GMT à PST.
Alors, comment déterminer
offset
? Voici une fonction simple à condition que vous n'ayez que quelques possibilités de conversion sans utiliser d'objets datetime qui sont «conscients» du fuseau horaire, ce que font bien d'autres réponses. Un peu manuel, mais parfois la clarté est meilleure.Après avoir examiné les nombreuses réponses et joué avec le code le plus serré auquel je puisse penser (pour l'instant), il semble préférable que toutes les applications, où le temps est important et où les fuseaux horaires mixtes doivent être pris en compte, fassent un réel effort pour créer tous les objets datetime. "conscient". Alors il semblerait que la réponse la plus simple soit:
pour convertir en GMT par exemple. Bien sûr, pour convertir vers / depuis n'importe quel autre fuseau horaire de votre choix, local ou autre, utilisez simplement la chaîne de fuseau horaire appropriée que pytz comprend (à partir de pytz.all_timezones). L'heure d'été est alors également prise en compte.
la source