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.

calccrypto
la source

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

nmichaels
la source
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())
Naren
la source
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
unutbu
la source
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.

user3226167
la source
3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")
Falmarri
la source
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