Quelle est la manière la plus simple d'obtenir l'heure GMT actuelle au format d'horodatage Unix?

175

Python fournit des paquets différents ( datetime, time, calendar) comme on peut le voir ici pour faire face avec le temps. J'ai fait une grosse erreur en utilisant ce qui suit pour obtenir l'heure GMT actuelletime.mktime(datetime.datetime.utcnow().timetuple())

Quel est un moyen simple d'obtenir l'heure GMT actuelle dans l'horodatage Unix?

Cory
la source
1
Que sont les entrées / sorties? datetime.utcnow()renvoie l'heure UTC actuelle en tant qu'objet datetime (je suppose que vous voulez UTC lorsque vous parlez de "l'heure GMT"). time.time()renvoie l'horodatage Unix directement sous forme de nombre flottant. Voici comment convertir datetime.date/datetime.datetime représentant l'heure UTC en horodatage POSIX .
jfs
La méthode que vous proposez est-elle erronée ou trop verbeuse? En relation: stackoverflow.com/questions/15940280/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Pourquoi votre méthode était-elle une erreur?
skeller88

Réponses:

230

J'utiliserais time.time () pour obtenir un horodatage en secondes depuis l'époque.

import time

time.time()

Production:

1369550494.884832

Pour l'implémentation standard de CPython sur la plupart des plates-formes, cela renverra une valeur UTC.

Edmond Burnett
la source
21
Le hic, c'est que l'horloge locale de votre machine n'est peut-être pas en UTC.
9000
@ 9000: Correct, même si j'insisterais toujours sur UTC dans tout environnement où le chronométrage importait. Et il a demandé la solution la plus simple. Notez qu'avec CPython sur les plates-formes modernes, y compris Linux, BSD, Mac OS X et Windows, tous renverront UTC pour time.time (). Cela reflète le comportement de la fonction de temps de la bibliothèque standard C sur ces OS.
Edmond Burnett
66
@ 9000: le fuseau horaire local n'a pas d'importance. L'heure Unix correspond à l'heure UTC (si l'on ignore l'heure autour des secondes intercalaires). Pensez-y: l'horodatage est le nombre de secondes écoulées depuis l'époque (un moment fixe dans le temps): pourquoi dépendrait-il de l'horloge locale de la machine de fuseau horaire? À tout moment donné, l'heure Unix est la même partout dans le monde. Certaines plates-formes (inconnues) pourraient utiliser une époque différente, mais sa valeur ne dépendrait toujours pas du fuseau horaire local.
jfs
stackoverflow.com/questions/13890935/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
125
import time

int(time.time()) 

Production:

1521462189
Max
la source
42

est-ce que cela aide?

from datetime import datetime
import calendar

d = datetime.utcnow()
unixtime = calendar.timegm(d.utctimetuple())
print unixtime

Comment convertir un objet datetime UTC Python en horodatage UNIX

Nick Caplinger
la source
@Cairnarvon Ce n'était qu'un exemple. Si vous voulez l'horodatage actuel, vous pouvez simplement appeler time.time()et n'avez pas besoin de conversion de date / heure du tout.
Messa
1
FWIW: Ce n'est pas l'heure UTC, c'est l'UTC converti en heure locale. Pour obtenir un horodatage en UTC, vous devez faire autre chose.
Sherlock70
18

Ou simplement en utilisant le module standard datetime

In [2]: from datetime import timezone, datetime
   ...: int(datetime.now(tz=timezone.utc).timestamp() * 1000)
   ...: 
Out[2]: 1514901741720

Vous pouvez tronquer ou multiplier selon la résolution souhaitée. Cet exemple produit des millis.

Si vous voulez un horodatage Unix correct (en secondes), supprimez le* 1000

Maresh
la source
Vous codez très spécifiquement pour forcer le temps dans un entier, donc je ne comprends pas pourquoi le texte de sortie est un nombre décimal?
Weston
ye my bad, j'ai ajouté le casting int plus tard
Maresh
C'est l'équivalent exact de la momentbibliothèque Javascript moment().utc().valueOf(). Exactement ce que je cherchais. Merci
azhar22k
L'horodatage UNIX est censé être en secondes depuis 1970. Votre solution ne produit pas cela.
skyking
1
"Vous pouvez tronquer ou multiplier en fonction de la résolution souhaitée" Supprimez la partie * 1000 et vous obtenez des secondes.
Maresh
18

python2 et python3

il est bon d'utiliser le module de temps

import time
int(time.time())

1573708436

vous pouvez également utiliser le module datetime, mais lorsque vous utilisez strftime ('% s'), mais strftime convertit l'heure en votre heure locale!

python2

from datetime import datetime
datetime.utcnow().strftime('%s')

python3

from datetime import datetime
datetime.utcnow().timestamp()
MikA
la source
2
Être en UTC + 1, time.time()et datetime.utcnow().timestamp()ne pas donner la même valeur!
user136036
De plus, même si je m'attendais à ce que la deuxième option soit correcte, j'ai dû utiliser datetime.now (). Timestamp () pour obtenir la valeur correcte en UTC + 1100. Je m'attendais à ce que horodatage () fonctionne correctement pour l'un ou l'autre, mais cela ne semble pas
David Waterworth
En regardant de plus près, datetime.utcnow () et datetime.now () renvoient un datetime naïf (pas de tzinfo), et timestamp () semble supposer local lorsque tzinfo = null.
David Waterworth le
2

J'aime cette méthode:

import datetime, time

dts = datetime.datetime.utcnow()
epochtime = round(time.mktime(dts.timetuple()) + dts.microsecond/1e6)

Les autres méthodes publiées ici ne sont pas garanties de vous donner UTC sur toutes les plates-formes ou ne rapportent que des secondes entières. Si vous voulez une résolution complète, cela fonctionne, à la micro-seconde.

vschmidt
la source
1
Malheureusement, cela ne semble pas donner UTC sauf si vous vous trouvez dans un fuseau horaire UTC + 0000. Utiliser à la utctimetupleplace fait cependant l'affaire.
skyking
1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

Production:

1544524990
2ni
la source
cela ne revient pas le même que time.time()pour moi.
Alwinius le
1
C'est probablement parce que dt.utcnowretourne une datetimeinformation sans fuseau horaire. strftimeSuppose ensuite que l' datetimeheure est locale.
skyking
1
@skyking C'est à peu près le problème pour presque toutes les réponses sur cette page!
David Waterworth
1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

Sortie: 1572878043380

#second example:
import time
timstamp2 =int(time.time())
print(timstamp2)

Sortie: 1572878043

  • Ici, nous pouvons voir que le premier exemple donne une heure plus précise que le second.
  • Ici, j'utilise le premier.
Chandan Sharma
la source
1

Au moins en python3, cela fonctionne:

>>> datetime.strftime(datetime.utcnow(), "%s")
'1587503279'
numéro d'utilisateur
la source