To może nie dać poprawnej odpowiedzi. Zgodnie z dokumentami „zauważ, że chociaż czas jest zawsze zwracany jako liczba zmiennoprzecinkowa, nie wszystkie systemy zapewniają czas z lepszą precyzją niż 1 sekunda”
Jason Polites
11
Zastanawiam się, dlaczego potrzebujesz round? Wydaje się, że int(time.time() * 1000)wystarczy?
Maxim Vladimirsky
14
IMO użyłbym podłogi, a nie okrągłej, ale to tylko ja. Jeśli ktoś zapyta, która jest godzina, a jest 7:32, prawdopodobnie liczba, której chce, to 7, a nie 8.
@MaximVladimirsky To nie jest zachowanie int (). Int nie podaje wartości minimalnej, zaokrągla w kierunku zera. To samo dla liczby dodatniej, ale przeciwnie dla liczby ujemnej. int (1.5) daje 1, int (-1,5) daje -1, matematyka. podłoga (-1,5) daje -2 Patrz: docs.python.org/2/library/stdtypes.html
Pomiń Huffman
91
time.time()może dać rozdzielczość tylko drugiemu, preferowanym podejściem dla milisekund jest datetime.
from datetime import datetime
dt = datetime.now()
dt.microsecond
+1, ponieważ jest to oficjalny sposób na uzyskanie wiarygodnego znacznika czasu z systemu.
Pascal
16
-1. to jest nieprawidłowa odpowiedź na to pytanie. jak skomentował @ Boris, nie daje to „czasu w mikrosekundach”, np. nie obejmuje dni, godzin i sekund w liczbie mikrosekund.
ja
3
+1 To daje prawidłową wartość i można założyć, że arytmetyka działa, ponieważ matematyka. Jeśli użytkownik potrzebuje aktualnego czasu w milisekundach / mikrosekundach, prosta arytmetyka go tam osiągnie. Jeśli potrzebna jest delta czasu - o którą nie jest proszony - arytmetyka, znowu oszczędza dzień.
Jack Stout
3
Podaje mikrosekundę bieżącego czasu, a nie cały znacznik czasu.
Jeśli potrzebujesz prostej metody w kodzie, która zwraca milisekundy z 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
to jest różnica między dwa razy w milisekundach, połączenie metody z odpowiedzią @Jason daje aktualny znacznik czasu w milisekundach. Pomyśląc o tym, znacznik czasu UNIX byłby twoją metodą z start_time= datetime (1970,1,1)
PR
czas lokalny może być niejednoznaczny i niemonotoniczny (ze względu na przejścia DST lub inne powody zmiany lokalnego przesunięcia utc). Użyj .utcnow()zamiast tego lub jeśli nie potrzebujesz czasu bezwzględnego, możesz użyć time.monotonous(). Uwaga: istnieje subtelna różnica wynikająca z arytmetyki zmiennoprzecinkowej między some_int + dt.microseconds/ 1000.0formułą ( ) / 10**3i włączonym prawdziwym dzieleniem. Zobacz wyraźną formułę i link total_seconds()w pokrewnej odpowiedzi
jfs
7
Najprostszym sposobem na uzyskanie bieżącego czasu UTC w milisekundach jest:
Jeśli obawiasz się o pomiar upływającego czasu, powinieneś użyć zegara monotonicznego (python 3) . Aktualizacje zegara systemowego nie mają wpływu na ten zegar, tak jakbyś na przykład sprawdził, czy zapytanie NTP skorygowało czas systemowy.
>>>import time
>>> millis = round(time.monotonic()*1000)
Podaje czas odniesienia w sekundach, który można wykorzystać do późniejszego porównania w celu pomiaru upływającego czasu.
Jeśli użyjesz mojego kodu (poniżej), czas pojawi się w sekundach, a następnie, po przecinku, w milisekundach. Myślę, że istnieje różnica między Windows i Unix - proszę o komentarz, jeśli tak jest.
Brak różnic w systemie Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn
1
Brak różnic na Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn
1
Te wielokrotności do 1000 w milisekundach mogą być przyzwoite do rozwiązania lub uczynienia pewnych warunków wstępnych akceptowalnymi. Można go użyć do wypełnienia luki w bazie danych, która tak naprawdę nigdy go nie używa. Chociaż w rzeczywistych sytuacjach, które wymagają precyzyjnego pomiaru czasu, ostatecznie się nie powiedzie. Nie sugerowałbym, aby ktokolwiek używał tej metody do operacji o znaczeniu krytycznym, które wymagają działań lub przetwarzania w określonym czasie.
Na przykład: pingi w obie strony mają 30-80 ms w USA ... Nie można tak po prostu zaokrąglić w górę i efektywnie wykorzystać.
Mój własny przykład wymaga zadań w każdej sekundzie, co oznacza, że gdybym zaokrąglił w górę po odpowiedzi na pierwsze zadania, nadal ponosiłbym czas przetwarzania pomnożony przez każdy cykl głównej pętli. Skończyło się to całkowitym wywołaniem funkcji co 60 sekund. to ~ 1440 dziennie ... niezbyt dokładne.
To tylko myśl dla osób szukających dokładniejszego rozumowania, które nie jest w stanie rozwiązać luki w bazie danych, która tak naprawdę nigdy jej nie wykorzystuje.
import time; ms = time.time()*1000.0
time.time()
może zapewniać gorszą precyzję niżdatetime.utcnow()
na niektórych platformach i wersjach Pythona.Odpowiedzi:
Oto, co potrzebowałem, oto co zrobiłem na podstawie powyższego komentarza @samplebias:
Szybko i łatwo. Dzięki wszystkim, przepraszam za pierdnięcie mózgu.
Do ponownego użycia:
Następnie:
źródło
round
? Wydaje się, żeint(time.time() * 1000)
wystarczy?.utcnow()
używaGetSystemTimeAsFileTime()
ostatnio CPython w systemie Windows . Czytime.clock()
wywołanie (QueryPerformanceCounter()
) nie wprowadziłoby więcej szumów niż mogłoby to zredukować? Zobacz Precyzja to nie to samo co dokładność .time.time()
może dać rozdzielczość tylko drugiemu, preferowanym podejściem dla milisekund jestdatetime
.źródło
źródło
.total_seconds()
(prawdopodobnie) lepszą precyzję:(td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3
(z włączonym prawdziwym dzieleniem) Lub jeśli chcesz skrócić milisekundy, użyj// 10**3
.Od wersji 3.7 możesz użyć,
time.time_ns()
aby uzyskać upływ czasu w ciągu nano sekund od epoki. Więc możesz to zrobićuzyskać czas w mili-sekundach jako liczbę całkowitą.
źródło
Po prostu przykładowy kod:
Wyjście: 1534343781311
źródło
innym rozwiązaniem jest funkcja, którą można osadzić we własnym pliku utils.py
źródło
Jeśli potrzebujesz prostej metody w kodzie, która zwraca milisekundy z datetime:
źródło
start_time
= datetime (1970,1,1).utcnow()
zamiast tego lub jeśli nie potrzebujesz czasu bezwzględnego, możesz użyćtime.monotonous()
. Uwaga: istnieje subtelna różnica wynikająca z arytmetyki zmiennoprzecinkowej międzysome_int + dt.microseconds/ 1000.0
formułą( ) / 10**3
i włączonym prawdziwym dzieleniem. Zobacz wyraźną formułę i linktotal_seconds()
w pokrewnej odpowiedziNajprostszym sposobem na uzyskanie bieżącego czasu UTC w milisekundach jest:
źródło
Jeśli obawiasz się o pomiar upływającego czasu, powinieneś użyć zegara monotonicznego (python 3) . Aktualizacje zegara systemowego nie mają wpływu na ten zegar, tak jakbyś na przykład sprawdził, czy zapytanie NTP skorygowało czas systemowy.
Podaje czas odniesienia w sekundach, który można wykorzystać do późniejszego porównania w celu pomiaru upływającego czasu.
źródło
Jeśli użyjesz mojego kodu (poniżej), czas pojawi się w sekundach, a następnie, po przecinku, w milisekundach. Myślę, że istnieje różnica między Windows i Unix - proszę o komentarz, jeśli tak jest.
mój wynik (w systemie Windows) to:
EDYCJA : Nie ma różnicy :) Dzięki tc0nn
źródło
/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
python3 scratch.py 1577212763.9136133
Te wielokrotności do 1000 w milisekundach mogą być przyzwoite do rozwiązania lub uczynienia pewnych warunków wstępnych akceptowalnymi. Można go użyć do wypełnienia luki w bazie danych, która tak naprawdę nigdy go nie używa. Chociaż w rzeczywistych sytuacjach, które wymagają precyzyjnego pomiaru czasu, ostatecznie się nie powiedzie. Nie sugerowałbym, aby ktokolwiek używał tej metody do operacji o znaczeniu krytycznym, które wymagają działań lub przetwarzania w określonym czasie.
Na przykład: pingi w obie strony mają 30-80 ms w USA ... Nie można tak po prostu zaokrąglić w górę i efektywnie wykorzystać.
Mój własny przykład wymaga zadań w każdej sekundzie, co oznacza, że gdybym zaokrąglił w górę po odpowiedzi na pierwsze zadania, nadal ponosiłbym czas przetwarzania pomnożony przez każdy cykl głównej pętli. Skończyło się to całkowitym wywołaniem funkcji co 60 sekund. to ~ 1440 dziennie ... niezbyt dokładne.
To tylko myśl dla osób szukających dokładniejszego rozumowania, które nie jest w stanie rozwiązać luki w bazie danych, która tak naprawdę nigdy jej nie wykorzystuje.
źródło
Kolejne rozwiązanie wykorzystujące
datetime
moduł Python 3.źródło