Comment puis-je obtenir l'heure actuelle en millisecondes en Python?
time.time()
peut fournir une précision pire que datetime.utcnow()
sur certaines plateformes et versions python.
Comment puis-je obtenir l'heure actuelle en millisecondes en Python?
time.time()
peut fournir une précision pire que datetime.utcnow()
sur certaines plateformes et versions python.
Réponses:
Pour ce dont j'avais besoin, voici ce que j'ai fait, basé sur le commentaire de @samplebias ci-dessus:
import time
millis = int(round(time.time() * 1000))
print millis
Quick'n'easy. Merci à tous, désolé pour le pet du cerveau.
Pour réutilisation:
import time
current_milli_time = lambda: int(round(time.time() * 1000))
Alors:
>>> current_milli_time()
1378761833768
round
? Cela me semble int(time.time() * 1000)
suffisant?
.utcnow()
utilise GetSystemTimeAsFileTime()
sur CPython récent sous Windows . L' time.clock()
appel ( QueryPerformanceCounter()
) n'introduirait-il pas plus de bruit qu'il n'en réduirait? Voir Précision n'est pas la même chose que précision .
time.time()
peut seulement donner une résolution à la seconde, l'approche préférée pour les millisecondes est datetime
.
from datetime import datetime
dt = datetime.now()
dt.microsecond
def TimestampMillisec64():
return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000)
.total_seconds()
produire (éventuellement) une meilleure précision: (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3
(avec la vraie division activée) Ou si vous voulez tronquer les millisecondes, utilisez // 10**3
.
À partir de la version 3.7, vous pouvez utiliser time.time_ns()
pour obtenir le temps passé en nano secondes depuis l'époque. Vous pouvez donc faire
ms = time.time_ns() // 1000000
pour obtenir le temps en mili-secondes sous forme d'entier.
Si vous voulez une méthode simple dans votre code qui retourne les millisecondes avec datetime:
from datetime import datetime
from datetime import timedelta
start_time = datetime.now()
# returns the elapsed milliseconds since the start of the program
def millis():
dt = datetime.now() - start_time
ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
return ms
start_time
= datetime (1970,1,1)
.utcnow()
place ou si vous n'avez pas besoin du temps absolu, vous pouvez utiliser time.monotonous()
. Remarque: il existe une différence subtile en raison de l'arithmétique à virgule flottante entre some_int + dt.microseconds/ 1000.0
et la formule ( ) / 10**3
avec la vraie division activée. Voir la formule explicite et le lien pour total_seconds()
dans la réponse connexe
Si vous souhaitez mesurer le temps écoulé, vous devez utiliser l' horloge monotone (python 3) . Cette horloge n'est pas affectée par les mises à jour de l'horloge système comme vous le verriez si une requête NTP ajustait l'heure de votre système, par exemple.
>>> import time
>>> millis = round(time.monotonic() * 1000)
Il fournit un temps de référence en secondes qui peut être utilisé pour comparer plus tard afin de mesurer le temps écoulé.
Si vous utilisez mon code (ci-dessous), le temps apparaîtra en secondes, puis, après une décimale, en millisecondes. Je pense qu'il y a une différence entre Windows et Unix - veuillez commenter s'il y en a.
from time import time
x = time()
print(x)
mon résultat (sous Windows) était:
1576095264.2682993
EDIT : Il n'y a pas de différence :) Merci tc0nn
/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
python3 scratch.py 1577212763.9136133
Ces multiplications à 1000 pour les millisecondes peuvent être décentes pour résoudre ou rendre acceptable certaines conditions préalables. Il pourrait être utilisé pour combler une lacune dans votre base de données qui ne l'utilise pas vraiment. Bien que, pour des situations réelles qui nécessitent un timing précis, cela échouerait finalement. Je ne suggérerais à personne d'utiliser cette méthode pour des opérations critiques qui nécessitent des actions ou un traitement à des moments précis.
Par exemple: les pings aller-retour sont de 30 à 80 ms aux États-Unis ... Vous ne pouvez pas simplement arrondir cela et l'utiliser efficacement.
Mon propre exemple nécessite des tâches à chaque seconde, ce qui signifie que si j'arrondis après que les premières tâches aient répondu, j'encourrais toujours le temps de traitement multiplié à chaque cycle de boucle principale. Cela a fini par être un appel de fonction total toutes les 60 secondes. c'est ~ 1440 par jour .. pas trop précis.
Juste une pensée pour les personnes qui recherchent un raisonnement plus précis au-delà de la résolution d'une lacune dans la base de données qui ne l'utilise jamais vraiment.
import time; ms = time.time()*1000.0