Comment obtenir les secondes depuis l'époque à partir de la sortie heure + date de gmtime ()?


162

Comment faites-vous l'inverse gmtime(), où vous mettez l'heure + la date et obtenez le nombre de secondes?

J'ai des cordes comme 'Jul 9, 2009 @ 20:02:58 UTC', et je veux récupérer le nombre de secondes entre l'époque et le 9 juillet 2009.

J'ai essayé time.strftimemais je ne sais pas comment l'utiliser correctement, ou si c'est la bonne commande à utiliser.

Réponses:


123

Si vous êtes arrivé ici parce qu'un moteur de recherche vous a dit que voici comment obtenir l'horodatage Unix, arrêtez de lire cette réponse. Faites défiler vers le bas.

Si vous voulez inverser time.gmtime(), vous voulez calendar.timegm().

>>> calendar.timegm(time.gmtime())
1293581619.0

Vous pouvez transformer votre chaîne en un tuple de temps avec time.strptime(), qui retourne un tuple de temps que vous pouvez passer à calendar.timegm():

>>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778

Plus d'informations sur le module de calendrier ici


16
Si vous recherchez l'heure actuelle de l'époque Unix, veuillez vous référer au commentaire de @ DanJ ou à la réponse de naren, cette réponse est incorrecte!
kosii

641

Utilisez le module de temps :

epoch_time = int(time.time())

14
@DanJ: c'est le nombre de secondes écoulées depuis Epoch (un moment fixe dans le temps) et c'est la même chose dans n'importe quel fuseau horaire. Bien que si nous ignorons les instances de temps autour des secondes intercalaires; il est facile de le convertir en UTC si on timeutilise l'époque Unix (1970).
jfs

43
Notez que ce n'est pas ce que l'OP demandait, mais c'est ce que je voulais. Donc +1.
peurless_fool

6
c'est la réponse à ce qui est demandé dans le titre: "obtenir le temps depuis l'époque". +1
AlejandroVD

@JFSebastian cela donne une époque en secondes. Comment puis-je obtenir la résolution jusqu'à quelques millisecondes en utilisant la même réponse ci-dessus?
Marlon Abeykoon

2
pour étendre mon commentaire ci - dessus : la time.time()valeur ne dépend PAS du fuseau horaire local (si nous excluons les fuseaux horaires "bons" et autres) par exemple, si elle renvoie l'heure POSIX (comme sur la plupart des systèmes) alors c'est le nombre de secondes SI depuis l'époque (1970-01-01UTC) sans compter les secondes intercalaires. Cette valeur peut être convertie en UTC (à l'exclusion des secondes intercalaires) mais ce n'est pas UTC . @MarlonAbeykoon: J'aime cette réponse
jfs

10

Notez que l' time.gmtimehorodatage correspond 0à 1970-1-1 00:00:00.

In [61]: import time       
In [63]: time.gmtime(0)
Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time.mktime(time.gmtime(0)) vous donne un horodatage décalé d'un montant qui dépend de votre langue, qui en général peut ne pas être 0.

In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0

L'inverse de time.gmtimeest calendar.timegm:

In [62]: import calendar    
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0

Cela donne une meilleure explication et un meilleur exemple à time.mktime (qui prend en compte le fuseau horaire actuel), merci
Jkm

@Jkm: NE PAS utiliser mktime()avec gmtime(). mktime()accepte votre heure locale mais gmtime()renvoie l' heure UTC - votre fuseau horaire local peut et est susceptible d'être différent. "horodatage relatif à votre locale" n'a pas de sens: l'horodatage POSIX ne dépend pas de votre locale (fuseau horaire local) - c'est la même valeur partout dans le monde. «secondes depuis l'époque» est l'horodatage POSIX dans la plupart des cas (même sous Windows) - des choses comme les fuseaux horaires «corrects» qui utilisent l'échelle de temps TAI ne sont pas courantes. Voir Le time.time () de Python renvoie-t
jfs

@JF Sebastian Vous avez raison. En fait, j'ai eu un problème mktime()récemment. Pour certains serveurs Web python (Tornado par exemple), puisque le processus continue de s'exécuter, même si je change les paramètres régionaux du système, l' mktime()API du serveur Web appelée par l'API du serveur Web utilise toujours l' ancien fuseau horaire pour générer l'objet de temps. Je dois basculer gmtime()et appliquer manuellement le décalage gmt.
Jkm

5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

Cela devrait être différent de int(time.time()), mais il est sûr d'utiliser quelque chose commex % (60*60*24)

datetime - Types de date et d'heure de base:

Contrairement au module de temps, le module datetime ne prend pas en charge les secondes intercalaires.


3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")

Je ne peux pas accéder à strptime pour une raison quelconque. J'ai importé datetime
calccrypto

1
@calccrypto vous devez soit from datetime import datetimeou fairedatetime.datetime.strptime
pathikrit

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.