Convertir UTC datetime chaîne locale datetime
Je n'ai jamais eu de convertir l'heure et de l'heure UTC. Récemment eu une demande pour avoir mon appli soit le fuseau horaire courant, et je l'ai eu à me courir en rond. Beaucoup d'informations sur la conversion de l'heure locale à l'UTC, que j'ai trouvé assez élémentaire (peut-être que je fais de mal que de bien), mais je ne peux pas trouver toutes les informations sur facilement la conversion de l'heure UTC pour les utilisateurs finaux dans le fuseau horaire.
En un mot, et l'application android envoie moi (appengine app) et des données dans les données est un timestamp. Pour stocker le timestamp de l'heure utc, je suis en utilisant:
datetime.utcfromtimestamp(timestamp)
Qui semble être au travail. Lorsque mon application stocke les données, c'est le magasin que 5 heures d'avance (je suis HNE -5)
Les données sont stockées sur appengine de BigTable, et quand récupéré il sort comme une chaîne de caractères comme suit:
"2011-01-21 02:37:21"
Comment puis-je convertir cette chaîne DateTime dans le fuseau horaire correct?
Aussi, qu'est-ce que le stockage recommandée pour les utilisateurs d'informations de fuseau horaire? (Comment faites-vous généralement store tz info c'est à dire: "-5:00" ou "EST", etc, etc ?) Je suis sûr que la réponse à ma première question, peut contenir un paramètre les réponses à la seconde.
- connexes: Comment faire pour convertir un python utc datetime pour un datetime local en utilisant uniquement de la bibliothèque standard de python?
- Cette réponse montre comment résoudre ce problème d'une manière simple.
Vous devez vous connecter pour publier un commentaire.
Si vous ne voulez pas vous fournir votre propre
tzinfo
objets, découvrez la python-dateutil de la bibliothèque. Il fournittzinfo
implémentations sur le haut d'une zoneinfo (Olson) de la base de données de telle sorte que vous pouvez vous référer aux règles de fuseau horaire par un peu de nom canonique.Modifier Élargi exemple pour montrer
strptime
utilisationEdit 2 Fixe d'utilisation de l'API de montrer meilleur point d'entrée de la méthode
Modifier 3 Inclus auto-détection des méthodes pour les fuseaux horaires (Yarin)
pytz
(pytz.sourceforge.net) qui fournit la tz de la base de données ainsi. Personnellement, je préfèrepython-dateutil
raison de tous les autres modules d'utilitaire, il offre, mais si vous ne voyez pas vous-même à l'aide de ces modulespytz
travaille trop.from_zone
etto_zone
sontNone
, alors il y a peut être un problème avec le zoneinfo base de données sur votre système. Quel système d'exploitation/distribution utilisez-vous? Merci pour la faute de frappe, j'ai corrigé.None
erreur comme @aschmid00, trop. Je suis sur la dernière 10.6.7 version de Snow Leopard. Est il possible que je peux vérifier pour voir qui tz sont dans mon zoneinfo base de données?dateutil.tz
et l'utilisationtz.tzutc()
ettz.tzlocal()
que le fuseau horaire objets que je cherchais. Il ressemble à la fois de la zone de la base de données sur mon système est bon (j'ai vérifié dans/usr/share/zoneinfo
). Pas sûr de ce qui était en haut.tz
module est le bon point d'entrée à l'aide de cette bibliothèque. J'ai mis à jour ma réponse pour refléter cela. Ledateutil.zoneinfo
module j'exposais précédemment est utilisée en interne par letz
module comme une chute en arrière si elle ne peut pas localiser le système de zoneinfo DB. Si vous regardez à l'intérieur de la bibliothèque, vous verrez qu'il y a un zoneinfo DB archive dans le paquet qu'il utilise si il ne peut pas trouver de votre système DB. Mon ancien exemple a été d'essayer de frapper le DB directement et je devine que vous avez eu des problèmes de chargement du privé DB (n'est pas sur le python path en quelque sorte?)dateutil
, utilisezpytz
à la place.dateutil
version?python-dateutil-2.5.2
).tz.tzlocal()
à tous les deux, tout est smart assez pour le faire fonctionner? Vous dites UTC ne change pas avec l'heure d'été, donc si il y a disons exactement 6 mois (environ 4320h) entre les 2 dates, quand j'applique latz.tzlocal()
il y aura toujours des 4320h entre les deux dates, même si je visais heure par heure, il pourrait être 4321 parce que nous avons sauté d'une heure pour l'heure d'été? Si cela fonctionne de cette façon, c'est la date de juillet est probablement faux (GMT-5 au lieu de GMT-4 avec l'heure d'été). Désolé si c'est confus, juste essayer de comprendre ici.Voici un élastique méthode qui ne dépend pas de toutes les bibliothèques externes:
Cela évite les problèmes de synchronisation de DelboyJay l'exemple. Et le moindre des problèmes de timing dans Erik van Oosten de l'amendement.
À une intéressante note de bas de page, le décalage horaire est calculée ci-dessus peut différer de la suite apparemment l'équivalent de l'expression, probablement en raison de l'heure avancée des changements à la règle:
Mise à jour: Cet extrait a la faiblesse de l'aide de l'UTC décalage de l'heure présente, qui peut différer de l'UTC offset de l'entrée de type datetime. Voir les commentaires sur cette réponse pour une autre solution.
Pour contourner les différents temps, prenez le époque de l'heure passée. Voici ce que je fais:
pytz
-comme db est impossible, voir PEP-431. Si vous pouvez écrire stdlib seule solution qui fonctionne dans de tels cas, sur les systèmes qui ont déjà historique fuseau horaire db par exemple, Linux, OS X, reportez-vous à ma réponse.utc_datetime
temps.Voir le datetime documentation sur tzinfo objets. Vous avez à mettre en œuvre les fuseaux horaires que vous souhaitez pour vous soutenir. Les exemples en bas de la documentation.
Voici un exemple simple:
De sortie
replace
de régler le fuseau horaire de GMT et de faire le fuseau horaire "conscients", puis utiliserastimezone
convertir à un autre fuseau horaire.Si vous voulez obtenir le résultat correct, même pour l'époque qui correspond à un ambiguë, heure locale (par exemple, lors d'une transition d'heure d'été) et/ou le décalage utc différents à des moments différents dans votre fuseau horaire local puis utilisez
pytz
de fuseaux horaires:Cette réponse devrait être utile si vous ne souhaitez pas utiliser d'autres modules d'ailleurs
datetime
.datetime.utcfromtimestamp(timestamp)
retourne un naïfdatetime
objet (pas au courant). Conscients sont fuseau horaire courant, et naïf ne le sont pas. Vous voulez une connaissance si vous le voulez convertir entre les fuseaux horaires (par exemple, entre l'heure UTC et l'heure locale).Si vous n'êtes pas l'un de l'instanciation de la date pour commencer, mais vous pouvez toujours créer un naïf
datetime
objet en heure UTC, vous pourriez veux essayer ce Python 3.x code pour convertir:Être prudent de ne pas conclure à tort que si votre fuseau horaire est actuellement MDT que l'heure d'été ne fonctionne pas avec le code ci-dessus puisqu'il imprime MST. Vous remarquerez que si vous modifiez le mois d'août, il va imprimer MDT.
Un autre moyen facile d'obtenir un courant
datetime
objet (également en Python 3.x) est de créer avec un fuseau horaire spécifié pour commencer. Voici un exemple, à l'aide de l'UTC:Si vous utilisez Python 2.x, vous aurez probablement à sous-classe
datetime.tzinfo
et l'utiliser pour vous aider à créer une consciencedatetime
objet, depuisdatetime.timezone
n'existe pas en Python 2.x.Si l'aide de django, vous pouvez utiliser le fuseau horaire.localtime méthode (voir https://docs.djangoproject.com/en/dev/topics/i18n/timezones/).
J'traditionnellement reporter à l'interface -- send fois depuis le backend des timestamps ou de quelque autre format datetime au format UTC, puis de laisser le client à comprendre le décalage horaire et de rendre ces données dans le bon fuseau horaire.
Pour une webapp, c'est assez facile à faire en javascript -- vous pouvez comprendre le navigateur du décalage horaire assez facilement à l'aide de builtin méthodes et de rendre les données depuis le backend correctement.
Ici est un moyen rapide et sale version qui utilise les systèmes locaux des paramètres de travailler sur la différence de temps. REMARQUE: Ceci ne fonctionnera pas si vous avez besoin de les convertir à un fuseau horaire que votre système actuel n'est pas en cours d'exécution. J'ai testé ce avec le royaume-UNI paramètres sous BST fuseau horaire
datetime.fromtimestamp(ts)
: posix timestamp (float secondes) -> objet datetime en heure locale (il fonctionne bien si l'OS se souvient passé décalages horaires pour le fuseau horaire local c'est à dire, sur Unix, mais pas sur Windows pour les dates dans le passé)). Sinon pytz pourrait être utilisé.offset = datetime.utcnow().replace(minute=0, second=0, microsecond=0) - datetime.now().replace(minute=0, second=0, microsecond=0)
je suis bizarre différences microseconde sans elle.datetime.fromtimestamp(ts)
au lieu de la réponse?Vous pouvez utiliser
calendar.timegm
pour convertir votre temps de secondes depuis l'époque Unix ettime.localtime
de se reconvertir:Donne
Fri Jan 21 05:37:21 2011
(parce que je suis à l'UTC+03:00 fuseau horaire).De la réponse ici, vous pouvez utiliser le module pour convertir de l'utc à l'heure locale définie dans votre ordinateur:
Vous pouvez utiliser flèche
vous pouvez nourrir
arrow.get()
avec quoi que ce soit. timestamp, iso chaîne de caractères etcpar exemple, mon fuseau horaire est " +08:00'. entrée utc = 2018-10-17T00:00:00.111 Z, alors j'aurai de sortie = 2018-10-17T08:00:00+08:00