Je traite des dates en Python et je dois les convertir en horodatages UTC à utiliser dans Javascript. Le code suivant ne fonctionne pas:
>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)
La conversion de l'objet date d'abord en datetime n'aide pas non plus. J'ai essayé l'exemple sur ce lien , mais:
from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)
et maintenant soit:
mktime(utc.localize(input_date).utctimetuple())
ou
mktime(timezone('US/Eastern').localize(input_date).utctimetuple())
fonctionne.
Question donc générale: comment puis-je obtenir une date convertie en secondes depuis l'époque selon UTC?
datetime.date
, l'autre tente de convertir une représentation sous forme de chaîne d'un fuseau horaire à un autre. En tant que personne à la recherche d'une solution à ce problème, je ne peux pas conclure que ce dernier fournira la réponse que je recherche.Réponses:
Si
d = date(2011, 1, 1)
est en UTC:Si
d
est dans le fuseau horaire local:timestamp1
ettimestamp2
peut différer si minuit dans le fuseau horaire local n'est pas la même instance de temps que minuit en UTC.mktime()
peut renvoyer un résultat erroné s'ild
correspond à une heure locale ambiguë (par exemple, pendant la transition DST) ou s'ild
s'agit d'une date passée (future) où le décalage utc pourrait avoir été différent et le Cmktime()
n'a pas accès à la base de données tz sur la plate-forme donnée . Vous pourriez utiliser unpytz
module (par exemple viatzlocal.get_localzone()
) pour accéder à la base de données tz sur toutes les plateformes . En outre,utcfromtimestamp()
peut échouer etmktime()
peut retourner l' horodatage non-POSIX si"right"
fuseau horaire est utilisé .Pour convertir un
datetime.date
objet qui représente la date en UTC sanscalendar.timegm()
:Comment puis-je obtenir une date convertie en secondes depuis l'époque selon UTC?
Pour convertir
datetime.datetime
(pasdatetime.date
) un objet qui représente déjà l'heure en UTC en l'horodatage POSIX correspondant (afloat
).Python 3.3+
datetime.timestamp()
:Remarque: Il est nécessaire de fournir
timezone.utc
explicitement, sinon.timestamp()
supposez que votre objet datetime naïf se trouve dans le fuseau horaire local.Python 3 (<3.3)
De la documentation pour
datetime.utcfromtimestamp()
:Lecture intéressante: Epoch time vs time of day sur la différence entre Quelle heure est-il?et combien de secondes se sont écoulées?
Voir également: datetime a besoin d'une méthode "epoch"
Python 2
Pour adapter le code ci-dessus pour Python 2:
où
timedelta.total_seconds()
est équivalent à(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
calculé avec la véritable division activée.Exemple
Méfiez - vous des problèmes de virgule flottante .
Production
Comment convertir un
datetime
objet averti en horodatage POSIXSur Python 3:
Sur Python 2:
la source
timestamp = (dt - datetime.fromtimestamp(0)).total_seconds()
:?datetime(1970, 1, 1)
est plus explicite.fromtimestamp()
est incorrect ici (dt
est en UTC etutcfromtimestamp()
doit donc être utilisé à la place).totimestamp()
fonction dans la réponse.Pour les systèmes Unix uniquement :
Remarque 1: dizzyf a observé que cela s'applique aux fuseaux horaires localisés . Ne pas utiliser en production.
Remarque 2: Jakub Narębski a noté que cela ignore les informations de fuseau horaire même pour les datetime compatibles avec l'offset (testé pour Python 2.7).
la source
man strftime
les systèmes de type Unix.Hypothèse 1: vous essayez de convertir une date en horodatage, mais comme une date couvre une période de 24 heures, aucun horodatage ne représente cette date. Je suppose que vous souhaitez représenter l'horodatage de cette date à minuit (00: 00: 00.000).
Hypothèse 2: la date que vous présentez n'est pas associée à un fuseau horaire particulier, mais vous souhaitez déterminer le décalage à partir d'un fuseau horaire particulier (UTC). Sans connaître le fuseau horaire de la date, il n'est pas possible de calculer un horodatage pour un fuseau horaire spécifique. Je suppose que vous souhaitez traiter la date comme si elle se trouvait dans le fuseau horaire du système local.
Tout d'abord, vous pouvez convertir l'instance de date en un tuple représentant les différentes composantes de l'heure à l'aide du
timetuple()
membre:Vous pouvez ensuite convertir cela en horodatage en utilisant
time.mktime
:Vous pouvez vérifier cette méthode en la testant avec l'heure de l'époque elle-même (1970-01-01), auquel cas la fonction doit renvoyer le décalage de fuseau horaire pour le fuseau horaire local à cette date:
28800.0
est de 8 heures, ce qui serait correct pour le fuseau horaire du Pacifique (où je suis).la source
suivez le document python2.7, vous devez utiliser calendar.timegm () au lieu de time.mktime ()
la source
d
est en UTC?J'ai défini mes deux fonctions
ici:
la source
la question est un peu confuse. les horodatages ne sont pas UTC - ils sont une chose Unix. la date pourrait être UTC? en supposant que ce soit le cas, et si vous utilisez Python 3.2+, simple-date rend cela trivial:
si vous avez réellement l'année, le mois et le jour, vous n'avez pas besoin de créer
date
:et si la date est dans un autre fuseau horaire (cela importe parce que nous supposons que minuit sans heure associée):
[l'idée derrière simple-date est de rassembler toutes les données de date et d'heure de python dans une classe cohérente, afin que vous puissiez effectuer n'importe quelle conversion. ainsi, par exemple, il ira également dans l'autre sens:
]
la source
SimpleDate(date(2011,1,1), tz='America/New_York')
déclencheNoTimezone
, tandis quepytz.timezone('America/New_York')
ne déclenche aucune exception (simple-date==0.4.8
,pytz==2014.7
).pip install simple-date
, on dirait que c'est python3 / pip3 uniquement.Utilisation du package de flèche :
la source
arrow
utilisedateutil
etdateutil
connaît depuis de nombreuses années des bugs liés à la gestion du fuseau horaire. Ne l'utilisez pas si vous avez besoin de résultats corrects pour les fuseaux horaires avec un décalage UTC non fixe (il est correct de l'utiliser pour le fuseau horaire UTC mais le stdlib gère également le cas UTC).Une chaîne temporelle complète contient:
[+HHMM or -HHMM]
Par exemple:
1970-01-01 06:00:00 +0500
==1970-01-01 01:00:00 +0000
==UNIX timestamp:3600
Remarque:
Éditer:
la source
1970-01-01 06:00:00 +0500
à3600
que vous avez demandé.timezone
àpython2
, vous pouvez faire le calcul (06:00:00
-+0500
=01:00:00
) manuellement.Étant donné que vous avez un
datetime
objet appeléd
, utilisez ce qui suit pour obtenir l'horodatage en UTC:Et pour la direction opposée, utilisez ce qui suit:
la source
je suis impressionné par la discussion approfondie.
mes 2 cents:
depuis importation datetime date importation datetime
l'horodatage dans utc est:
ou,
si résulte maintenant de datetime.now (), dans le même DST
la source