Получить текущее время в миллисекундах в Python?


532

Как я могу получить текущее время в миллисекундах в Python?


67
import time; ms = time.time()*1000.0
Самплебиас

4
@samplebias: time.time()может обеспечить худшую точность, чем datetime.utcnow()на некоторых платформах и версиях Python.
Jfs

5
В миллисекундах с каких пор ? Если вы имеете в виду, начиная с эпохи (полночь 1 января 1970 года по Гринвичу), посмотрите это: stackoverflow.com/questions/18169099/…
Майкл Шепер

2
Истинные отметки времени в миллисекундах с микросекундным разрешением см. Здесь: stackoverflow.com/questions/38319606/…
Габриэль Стейплс

Ответы:


713

Вот что я сделал, основываясь на комментарии @samplebias выше:

import time
millis = int(round(time.time() * 1000))
print millis

Quick'n'easy. Спасибо всем, простите за пердеть мозг.

Для повторного использования:

import time

current_milli_time = lambda: int(round(time.time() * 1000))

Затем:

>>> current_milli_time()
1378761833768

34
Это может не дать правильный ответ. Согласно документам: «Обратите внимание, что, хотя время всегда возвращается как число с плавающей запятой, не все системы предоставляют время с большей точностью, чем 1 секунда»
Джейсон Политес

11
Мне интересно, зачем тебе это round? Кажется int(time.time() * 1000), достаточно?
Максим Владимирский

14
ИМО я бы использовал пол, а не круглый, но это только я. Если кто-то спросит, какой час, а сейчас 7:32, то число, которое он, вероятно, хочет, - 7, а не 8.
Давр

1
@ParallelUniverse: .utcnow()используется GetSystemTimeAsFileTime()в недавнем CPython для Windows . Не time.clock()вызовет ли ( QueryPerformanceCounter()) больше шума, чем может уменьшить? Точность см. Не то же самое, что точность .
JFS

10
@MaximVladimirsky Это не поведение int (). Int не определяет значение, оно округляется до нуля. Что то же самое для положительного числа, но наоборот для отрицательного. int (1.5) дает 1, int (-1.5) дает -1, math.floor (-1.5) дает -2 См .: docs.python.org/2/library/stdtypes.html
Пропустить Хаффмана

91

time.time()может дать разрешение только второй, предпочтительный подход для миллисекунд datetime.

from datetime import datetime
dt = datetime.now()
dt.microsecond

94
не совсем полезно - это дает вам только микросекунды в течение секунды dt. см. stackoverflow.com/a/1905423/74632
Борис Червенков

8
+1, потому что это официальный способ получить надежную временную метку из системы.
Паскаль

16
-1. это неправильный ответ на этот вопрос. Как прокомментировал @Boris, это не дает «время в микросекундах», например, не включает дни, часы, секунды в количестве микросекунд.
JA

3
+1 Это дает правильное значение, и можно считать, что арифметика работает, потому что математика. Если пользователю нужно текущее время в миллисекундах / микросекундах, его получит простая арифметика. Если требуется дельта времени - а это не требуется - арифметика, опять же, спасает день.
Джек Стаут,

3
Дает микросекунду текущего времени, а не всю метку времени.
kawadhiya21

48
def TimestampMillisec64():
    return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000) 

3
Вы можете вставить формулу для .total_seconds()получения (возможно) лучшей точности: (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3(с включенным истинным делением) Или, если вы хотите сократить миллисекунды, используйте // 10**3.
Jfs

1
Это кажется лучшим ответом, если использовать datetime
dlsso

35

Начиная с версии 3.7, вы можете использовать time.time_ns()время, прошедшее через нано секунды из эпохи. Так что вы можете сделать

ms = time.time_ns() // 1000000 

чтобы получить время в миллисекундах как целое число.


Это лучше всего сработало для меня (Python 3.7.6)
Пол Уотсон,


13

Другое решение - это функция, которую вы можете встроить в свой собственный utils.py.

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

12

Если вам нужен простой метод в вашем коде, который возвращает миллисекунды с датой и временем:

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

это разница между двумя разами в миллисекундах, объединение вашего метода с ответом @Jason дает текущую временную метку в миллисекундах ... Если подумать, временная метка UNIX будет вашим методом с start_time= datetime (1970,1,1)
PR

местное время может быть неоднозначным и немонотонным (из-за переходов DST или других причин для изменения локального смещения utc). Используйте .utcnow()вместо этого или если вам не нужно абсолютное время, то вы можете использовать time.monotonous(). Примечание: есть небольшая разница из-за арифметики с плавающей точкой между some_int + dt.microseconds/ 1000.0и формулой ( ) / 10**3с включенным истинным делением. См. Явную формулу и ссылку для total_seconds()в соответствующем ответе
JFS

7

Я нашел самый простой способ получить текущее время UTC в миллисекундах:

# timeutil.py
import datetime


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

# sample.py
import timeutil


timeutil.get_epochtime_ms()

7

Если вы беспокоитесь об измерении прошедшего времени, вы должны использовать монотонные часы (Python 3) . Эти часы не подвержены влиянию обновлений системных часов, как, например, если бы запрос NTP скорректировал ваше системное время.

>>> import time
>>> millis = round(time.monotonic() * 1000)

Он предоставляет контрольное время в секундах, которое можно использовать для последующего сравнения для измерения прошедшего времени.


4

Если вы используете мой код (ниже), время будет отображаться в секундах, а затем, после десятичной точки, в миллисекундах. Я думаю, что есть разница между Windows и Unix - пожалуйста, прокомментируйте, если есть.

from time import time

x = time()
print(x)

мой результат (на Windows) был:

1576095264.2682993

РЕДАКТИРОВАТЬ : нет никакой разницы :) Спасибо tc0nn


1
Нет различий на Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
tc0nn

1
Нет различий на Ubuntu 18:python3 scratch.py 1577212763.9136133
tc0nn

1

Эти умножения до 1000 для миллисекунд могут быть приличными для решения или принятия некоторого предварительного условия приемлемым. Это может быть использовано для заполнения пробела в вашей базе данных, которая на самом деле никогда не использует его. Хотя, для реальных ситуаций, которые требуют точного времени, это в конечном итоге потерпит неудачу. Я бы не предложил никому использовать этот метод для критически важных операций, которые требуют действий или обработки в определенные моменты времени.

Например: пинг в оба конца в США составляет 30-80 мс ... Вы не могли бы просто округлить это и использовать его эффективно.

Мой собственный пример требует выполнения задач каждую секунду, что означает, что если я соберусь после того, как первые задачи ответят, я все равно буду брать на себя время обработки, умноженное на каждый цикл основного цикла. В итоге это был полный вызов функции каждые 60 секунд. это ~ 1440 в день .. не слишком точно.

Просто мысль для людей, ищущих более точные рассуждения, помимо решения проблемы с базой данных, которая никогда не использует их


2
У вас есть лучшее решение? Также, честно говоря, я не понимаю, что вы говорите. Что вы подразумеваете под «округлить вверх»?
нетленная ночь

2
Объясните свое решение на практическом примере для лучшего понимания
Ратан Удай Кумар

-1

Просто еще одно решение с использованием datetimeмодуля для Python 3.

datetime.datetime.timestamp(datetime.datetime.now())
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.