Comment convertir une chaîne datetime en heure locale en une chaîne en temps UTC ?
Je suis sûr que je l'ai déjà fait, mais je ne le trouve pas et SO, je l'espère, m'aidera (et d'autres) à le faire à l'avenir.
Clarification : Par exemple, si j'ai 2008-09-17 14:02:00
dans mon fuseau horaire local ( +10
), je voudrais générer une chaîne avec l'équivalent UTC
temps: 2008-09-17 04:02:00
.
De plus, à partir de http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ , notez qu'en général ce n'est pas possible car avec l'heure d'été et d'autres problèmes il n'y a pas de conversion unique de l'heure locale en Heure UTC.
Réponses:
Tout d'abord, analysez la chaîne dans un objet datetime naïf. Il s'agit d'une instance
datetime.datetime
sans informations de fuseau horaire jointes. Consultez la documentation pour plusdatetime.strptime
d'informations sur l'analyse de la chaîne de date.Utilisez le
pytz
module, qui comprend une liste complète des fuseaux horaires + UTC. Déterminez ce qu'est le fuseau horaire local, construisez un objet de fuseau horaire à partir de celui-ci, et manipulez-le et attachez-le à la date / heure naïve.Enfin, utilisez la
datetime.astimezone()
méthode pour convertir le datetime en UTC.Code source, en utilisant le fuseau horaire local "America / Los_Angeles", pour la chaîne "2001-2-3 10:11:12":
À partir de là, vous pouvez utiliser la
strftime()
méthode pour formater le datetime UTC selon vos besoins:la source
tzlocal.get_localzone()
pour obtenir le fuseau horaire local en tantpytz
qu'objetLa fonction utcnow () du module datetime peut être utilisée pour obtenir l'heure UTC actuelle.
Comme le lien mentionné ci-dessus par Tom: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ dit:
REMARQUE - Si l'une de vos données se trouve dans une région qui utilise l'heure d'été, utilisez
pytz
et consultez la réponse de John Millikin.Si vous souhaitez obtenir l'heure UTC à partir d'une chaîne donnée et que vous avez la chance d'être dans une région du monde qui n'utilise pas l'heure d'été, ou si vous avez des données qui sont uniquement décalées de l'heure UTC sans application de l'heure d'été:
-> en utilisant l'heure locale comme base pour la valeur de décalage:
-> Ou, à partir d'un décalage connu, en utilisant datetime.timedelta ():
METTRE À JOUR:
Depuis python 3.2
datetime.timezone
est disponible. Vous pouvez générer un objet datetime sensible au fuseau horaire avec la commande ci-dessous:Si vous êtes prêt à effectuer des conversions de fuseau horaire, lisez ceci:
https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7
la source
tzinfo.utcoffset() must return a whole number of minutes
, etc.Merci @rofly, la conversion complète de chaîne en chaîne est la suivante:
Mon résumé des
time
/calendar
fonctions:time.strptime
string -> tuple (aucun fuseau horaire appliqué, correspond donc à string)
time.mktime
tuple d'heure locale -> secondes depuis l'époque (toujours heure locale)
time.gmtime
secondes depuis l'époque -> tuple en UTC
et
calendar.timegm
tuple en UTC -> secondes depuis l'époque
time.localtime
secondes depuis l'époque -> tuple dans le fuseau horaire local
la source
(always local time)
semble être faux: l'entrée de mktime () est l'heure locale, la sortie est en secondes depuis epoch (1970-01-01 00:00:00 +0000 (UTC)
) qui ne dépend pas du fuseau horaire.Voici un résumé des conversions de temps Python courantes.
Certaines méthodes perdent des fractions de secondes et sont marquées par (s) . Une formule explicite telle que
ts = (d - epoch) / unit
peut être utilisée à la place (merci jfs).calendar.timegm(struct_time)
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
(exception lors des transitions DST, voir commentaire de jfs)
calendar.timegm(dt.utctimetuple())
calendar.timegm(dt.utctimetuple())
time.gmtime(t)
(voir commentaire de jfs)
stz.localize(dt, is_dst=None).utctimetuple()
(exception lors des transitions DST, voir commentaire de jfs)
dt.utctimetuple()
dt.utctimetuple()
datetime.fromtimestamp(t, None)
(peut échouer dans certaines conditions, voir le commentaire de jfs ci-dessous)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
(ne peut pas représenter les secondes intercalaires, voir le commentaire de jfs)
dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
dt.astimezone(tz).replace(tzinfo=None)
datetime.utcfromtimestamp(t)
datetime.datetime(*struct_time[:6])
(ne peut pas représenter les secondes intercalaires, voir le commentaire de jfs)
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
(exception lors des transitions DST, voir commentaire de jfs)
dt.astimezone(UTC).replace(tzinfo=None)
datetime.fromtimestamp(t, tz)
(peut échouer pour les fuseaux horaires non pytz)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
(ne peut pas représenter les secondes intercalaires, voir le commentaire de jfs)
stz.localize(dt, is_dst=None)
(exception lors des transitions DST, voir commentaire de jfs)
dt.replace(tzinfo=UTC)
Source: taaviburns.ca
la source
fromtimestamp(t, None)
peut échouer si le fuseau horaire local a un décalage utc différentt
et que la bibliothèque C n'a pas accès à la base de données tz sur la plateforme donnée. Vous pouvez utilisertzlocal.get_localzone()
pour fournir des tzdata de manière portable. (2)fromtimestamp(t, tz)
peut échouer pour les fuseaux horaires non pytz. (3)datetime(*struct_time[:6])
vous manquez*
. (4)timegm()
,utctimetuple()
, desstruct_time
solutions à base tomber quelques fractions de seconde. Vous pouvez utiliser une formule explicite telle que: à lats = (d - epoch) / unit
place.stz.localize(dt, is_dst=None)
lève une exception pour les heures locales ambiguës ou inexistantes, par exemple, pendant les transitions DST. Pour éviter l'exception, l'utilisationstz.normalize(stz.localize(dt))
qui peut renvoyer des résultats imprécis. (6) datetime () ne peut pas représenter une seconde intercalaire. Convertissezstruct_time
en "secondes depuis l'époque" comme solution de contournement en premier. (7)time.gmtime(t)
contrairement à ce quicalendar.timegm()
peut s’attendre à une entrée non-POSIX si un fuseau horaire "correct" est utilisé. Utilisez plutôt la formule explicite si l'entrée est POSIX:gmtime = lambda t: datetime(1970,1,1, tzinfo=utc) + timedelta(seconds=t)
<table>
balises. Désolé. C'est intentionnel et par conception. Si vous avez besoin d'une" table "rapide et sale, utilisez une<pre>
disposition ASCII." Je ne crois pas qu'une table ASCII serait plus lisible que la liste ci-dessus.Source: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html
Exemple d'utilisation de bd808 : Si votre source est un
datetime.datetime
objett
, appelez comme:la source
t
, appelez en tant que: local_to_utc (t.timetuple ()).timetuple()
appelstm_isdst
à-1
; il y a 50% de chances d'mktime()
échouer pendant la transition DST.J'ai de la chance avec dateutil (qui est largement recommandé sur SO pour d'autres questions connexes):
(Le code a été dérivé de cette réponse pour convertir la chaîne de datetime UTC en datetime local )
la source
dateutil
peut échouer pour les dates passées si le fuseau horaire local avait alors un décalage utc différent (sans rapport avec les transitions DST) sur les systèmes où l'implémentation n'utilise pas de base de données de fuseau horaire historique (notamment Windows).pytz
+tzlocal
pourrait être utilisé à la place.Un autre exemple avec pytz, mais inclut localize (), qui m'a sauvé la journée.
la source
J'ai eu le plus de succès avec python-dateutil :
la source
dateutil
peut échouer pour les dates passéesla source
mktime(dt.timetuple())
peut échouer pendant la transition DST . Il y aLocalTimezone
dans les documents (cela fonctionne pour la définition de fuseau horaire la plus récente mais peut échouer pour les dates passées (sans rapport avec l'heure d'été))si vous préférez datetime.datetime:
la source
mktime()
attend l'heure locale comme entrée.fromtimestamp()
renvoie l'heure locale, pas l'utc. Si vous le résolvez, voyez ces problèmes supplémentaires (commedateutil
, la solution stdlib uniquement peut échouer)Facile
Je l'ai fait comme ça:
Mise en œuvre de fantaisie
Si vous voulez devenir chic, vous pouvez le transformer en un foncteur:
Résultat:
la source
Vous pouvez le faire avec:
la source
Que diriez-vous -
si secondes est
None
alors il convertit l'heure locale en temps UTC sinon convertit le temps écoulé en UTC.la source
Pour se déplacer à l'heure d'été, etc.
Aucune des réponses ci-dessus ne m'a particulièrement aidé. Le code ci-dessous fonctionne pour GMT.
la source
Utilisation de http://crsmithdev.com/arrow/
Cette bibliothèque vous facilite la vie :)
la source
J'ai trouvé la meilleure réponse sur une autre question ici . Il utilise uniquement des bibliothèques intégrées python et ne vous oblige pas à entrer votre fuseau horaire local (une exigence dans mon cas)
Je republie la réponse ici car cette question apparaît dans google au lieu de la question liée en fonction des mots clés de recherche.
la source
J'ai ce code dans l'un de mes projets:
la source
En python3:
pip install python-dateutil
la source
from dateutil import tz
Que diriez-vous -
si secondes est
None
alors il convertit l'heure locale en temps UTC sinon convertit le temps écoulé en UTC.la source