Cela peut ne pas donner la bonne réponse. Selon les documents, "Notez que même si l'heure est toujours renvoyée sous forme de nombre à virgule flottante, tous les systèmes ne fournissent pas l'heure avec une meilleure précision qu'une seconde"
Jason Polites
11
Je me demande, pourquoi en avez-vous besoin round? Cela me semble int(time.time() * 1000)suffisant?
Maxim Vladimirsky
14
OMI J'utiliserais le sol et non pas le rond, mais c'est juste moi. Si quelqu'un demande quelle est l'heure, et il est 7h32, le nombre qu'il veut probablement est 7, pas 8.
@MaximVladimirsky Ce n'est pas le comportement de int (). Int ne fixe pas une valeur, il arrondit vers zéro. C'est la même chose pour le nombre positif, mais l'inverse pour le nombre négatif. int (1.5) donne 1, int (-1.5) donne -1, math.floor (-1.5) donne -2 Voir: docs.python.org/2/library/stdtypes.html
Skip Huffman
91
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
+1, car il s'agit du moyen officiel d'obtenir un horodatage fiable du système.
Pascal
16
-1. c'est une réponse incorrecte à cette question. comme l'a commenté @Boris, cela ne donne pas "le temps en microsecondes", par exemple n'inclut pas les jours, les heures, les secondes en nombre de microsecondes.
ja
3
+1 Cela donne une valeur correcte et l'arithmétique peut être supposée fonctionner parce que les mathématiques. Si l'utilisateur a besoin de l'heure actuelle en millisecondes / microsecondes, une simple arithmétique les y amènera. Si un delta de temps est nécessaire - ce qui n'est pas demandé - l'arithmétique, encore une fois, sauve la mise.
Jack Stout
3
Donne une microseconde de l'heure actuelle, pas un horodatage 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 programdef millis():
dt = datetime.now()- start_time
ms =(dt.days *24*60*60+ dt.seconds)*1000+ dt.microseconds /1000.0return ms
c'est la différence entre deux fois en millisecondes, la combinaison de votre méthode avec la réponse de @Jason donne l'horodatage actuel en millisecondes ... En y réfléchissant, l'horodatage UNIX serait votre méthode avec start_time= datetime (1970,1,1)
PR
l'heure locale peut être ambiguë et non monotone (en raison de transitions DST ou d'autres raisons pour modifier le décalage utc local). Utilisez à la .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.0et la formule ( ) / 10**3avec la vraie division activée. Voir la formule explicite et le lien pour total_seconds()dans la réponse connexe
jfs
7
Le moyen le plus simple que j'ai trouvé pour obtenir l'heure UTC actuelle en millisecondes est:
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.
Pas de différence sur Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn
1
Pas de différence sur Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn
1
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
time.time()
peut fournir une précision pire quedatetime.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:
Quick'n'easy. Merci à tous, désolé pour le pet du cerveau.
Pour réutilisation:
Alors:
la source
round
? Cela me sembleint(time.time() * 1000)
suffisant?.utcnow()
utiliseGetSystemTimeAsFileTime()
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 estdatetime
.la source
la source
.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 fairepour obtenir le temps en mili-secondes sous forme d'entier.
la source
Juste un exemple de code:
Sortie: 1534343781311
la source
une autre solution est la fonction que vous pouvez intégrer dans votre propre utils.py
la source
Si vous voulez une méthode simple dans votre code qui retourne les millisecondes avec datetime:
la source
start_time
= datetime (1970,1,1).utcnow()
place ou si vous n'avez pas besoin du temps absolu, vous pouvez utilisertime.monotonous()
. Remarque: il existe une différence subtile en raison de l'arithmétique à virgule flottante entresome_int + dt.microseconds/ 1000.0
et la formule( ) / 10**3
avec la vraie division activée. Voir la formule explicite et le lien pourtotal_seconds()
dans la réponse connexeLe moyen le plus simple que j'ai trouvé pour obtenir l'heure UTC actuelle en millisecondes est:
la source
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.
Il fournit un temps de référence en secondes qui peut être utilisé pour comparer plus tard afin de mesurer le temps écoulé.
la source
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.
mon résultat (sous Windows) était:
EDIT : Il n'y a pas de différence :) Merci tc0nn
la source
/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.
la source
Juste une autre solution utilisant le
datetime
module pour Python 3.la source