Obtenir l'heure actuelle en millisecondes en Python?

532

Comment puis-je obtenir l'heure actuelle en millisecondes en Python?

Naftuli Kay
la source
67
import time; ms = time.time()*1000.0
biais d'échantillonnage
4
@samplebias: time.time()peut fournir une précision pire que datetime.utcnow()sur certaines plateformes et versions python.
jfs
5
En millisecondes depuis quand ? Si vous voulez dire depuis l'époque (minuit 1er janvier 1970 UTC), voyez ceci: stackoverflow.com/questions/18169099/…
Michael Scheper
2
Pour de véritables horodatages en millisecondes de résolution en microsecondes, voir ici: stackoverflow.com/questions/38319606/…
Gabriel Staples

Réponses:

713

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
Naftuli Kay
la source
34
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.
davr
1
@ParallelUniverse: .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 .
jfs
10
@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
Jason Polites
la source
94
pas très utile - cela ne vous donne que les microsecondes dans la seconde du dt. voir stackoverflow.com/a/1905423/74632
Boris Chervenkov
8
+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.
kawadhiya21
35

À 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.

zardosht
la source
Cela a fonctionné le mieux pour moi (Python 3.7.6)
Paul Watson
22

Juste un exemple de code:

import time
timestamp = int(time.time()*1000.0)

Sortie: 1534343781311

Wilson Wu
la source
13

une autre solution est la fonction que vous pouvez intégrer dans votre propre utils.py

import time as time_ #make sure we don't override time
def millis():
    return int(round(time_.time() * 1000))
Cadey
la source
12

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
Pascal
la source
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:

# timeutil.py
import datetime


def get_epochtime_ms():
    return round(datetime.datetime.utcnow().timestamp() * 1000)

# sample.py
import timeutil


timeutil.get_epochtime_ms()
Laymain
la source
7

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é.

phord
la source
4

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

PythonMaster202
la source
1
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.

Mike Guidry
la source
2
Avez-vous une meilleure solution? Honnêtement, je ne comprends pas du tout ce que vous dites. Qu'entendez-vous par «arrondir»?
Imperishable Night
2
Expliquez votre solution avec un exemple pratique pour une meilleure compréhension
Ratan Uday Kumar
0

Juste une autre solution utilisant le datetimemodule pour Python 3.

datetime.datetime.timestamp(datetime.datetime.now())
Vikas
la source