@samplebias: time.time()может обеспечить худшую точность, чем datetime.utcnow()на некоторых платформах и версиях Python.
Jfs
5
В миллисекундах с каких пор ? Если вы имеете в виду, начиная с эпохи (полночь 1 января 1970 года по Гринвичу), посмотрите это: stackoverflow.com/questions/18169099/…
Это может не дать правильный ответ. Согласно документам: «Обратите внимание, что, хотя время всегда возвращается как число с плавающей запятой, не все системы предоставляют время с большей точностью, чем 1 секунда»
Джейсон Политес
11
Мне интересно, зачем тебе это round? Кажется int(time.time() * 1000), достаточно?
Максим Владимирский
14
ИМО я бы использовал пол, а не круглый, но это только я. Если кто-то спросит, какой час, а сейчас 7:32, то число, которое он, вероятно, хочет, - 7, а не 8.
@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
+1, потому что это официальный способ получить надежную временную метку из системы.
Паскаль
16
-1. это неправильный ответ на этот вопрос. Как прокомментировал @Boris, это не дает «время в микросекундах», например, не включает дни, часы, секунды в количестве микросекунд.
JA
3
+1 Это дает правильное значение, и можно считать, что арифметика работает, потому что математика. Если пользователю нужно текущее время в миллисекундах / микросекундах, его получит простая арифметика. Если требуется дельта времени - а это не требуется - арифметика, опять же, спасает день.
Джек Стаут,
3
Дает микросекунду текущего времени, а не всю метку времени.
Если вам нужен простой метод в вашем коде, который возвращает миллисекунды с датой и временем:
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
это разница между двумя разами в миллисекундах, объединение вашего метода с ответом @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 в миллисекундах:
Если вы беспокоитесь об измерении прошедшего времени, вы должны использовать монотонные часы (Python 3) . Эти часы не подвержены влиянию обновлений системных часов, как, например, если бы запрос NTP скорректировал ваше системное время.
>>>import time
>>> millis = round(time.monotonic()*1000)
Он предоставляет контрольное время в секундах, которое можно использовать для последующего сравнения для измерения прошедшего времени.
Если вы используете мой код (ниже), время будет отображаться в секундах, а затем, после десятичной точки, в миллисекундах. Я думаю, что есть разница между Windows и Unix - пожалуйста, прокомментируйте, если есть.
from time import time
x = time()print(x)
мой результат (на Windows) был:
1576095264.2682993
РЕДАКТИРОВАТЬ : нет никакой разницы :) Спасибо tc0nn
Нет различий на 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 в день .. не слишком точно.
Просто мысль для людей, ищущих более точные рассуждения, помимо решения проблемы с базой данных, которая никогда не использует их
import time; ms = time.time()*1000.0
time.time()
может обеспечить худшую точность, чемdatetime.utcnow()
на некоторых платформах и версиях Python.Ответы:
Вот что я сделал, основываясь на комментарии @samplebias выше:
Quick'n'easy. Спасибо всем, простите за пердеть мозг.
Для повторного использования:
Затем:
источник
round
? Кажетсяint(time.time() * 1000)
, достаточно?.utcnow()
используетсяGetSystemTimeAsFileTime()
в недавнем CPython для Windows . Неtime.clock()
вызовет ли (QueryPerformanceCounter()
) больше шума, чем может уменьшить? Точность см. Не то же самое, что точность .time.time()
может дать разрешение только второй, предпочтительный подход для миллисекундdatetime
.источник
источник
.total_seconds()
получения (возможно) лучшей точности:(td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3
(с включенным истинным делением) Или, если вы хотите сократить миллисекунды, используйте// 10**3
.Начиная с версии 3.7, вы можете использовать
time.time_ns()
время, прошедшее через нано секунды из эпохи. Так что вы можете сделатьчтобы получить время в миллисекундах как целое число.
источник
Просто пример кода:
Выход: 1534343781311
источник
Другое решение - это функция, которую вы можете встроить в свой собственный utils.py.
источник
Если вам нужен простой метод в вашем коде, который возвращает миллисекунды с датой и временем:
источник
start_time
= datetime (1970,1,1).utcnow()
вместо этого или если вам не нужно абсолютное время, то вы можете использоватьtime.monotonous()
. Примечание: есть небольшая разница из-за арифметики с плавающей точкой междуsome_int + dt.microseconds/ 1000.0
и формулой( ) / 10**3
с включенным истинным делением. См. Явную формулу и ссылку дляtotal_seconds()
в соответствующем ответеЯ нашел самый простой способ получить текущее время UTC в миллисекундах:
источник
Если вы беспокоитесь об измерении прошедшего времени, вы должны использовать монотонные часы (Python 3) . Эти часы не подвержены влиянию обновлений системных часов, как, например, если бы запрос NTP скорректировал ваше системное время.
Он предоставляет контрольное время в секундах, которое можно использовать для последующего сравнения для измерения прошедшего времени.
источник
Если вы используете мой код (ниже), время будет отображаться в секундах, а затем, после десятичной точки, в миллисекундах. Я думаю, что есть разница между Windows и Unix - пожалуйста, прокомментируйте, если есть.
мой результат (на Windows) был:
РЕДАКТИРОВАТЬ : нет никакой разницы :) Спасибо tc0nn
источник
/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
python3 scratch.py 1577212763.9136133
Эти умножения до 1000 для миллисекунд могут быть приличными для решения или принятия некоторого предварительного условия приемлемым. Это может быть использовано для заполнения пробела в вашей базе данных, которая на самом деле никогда не использует его. Хотя, для реальных ситуаций, которые требуют точного времени, это в конечном итоге потерпит неудачу. Я бы не предложил никому использовать этот метод для критически важных операций, которые требуют действий или обработки в определенные моменты времени.
Например: пинг в оба конца в США составляет 30-80 мс ... Вы не могли бы просто округлить это и использовать его эффективно.
Мой собственный пример требует выполнения задач каждую секунду, что означает, что если я соберусь после того, как первые задачи ответят, я все равно буду брать на себя время обработки, умноженное на каждый цикл основного цикла. В итоге это был полный вызов функции каждые 60 секунд. это ~ 1440 в день .. не слишком точно.
Просто мысль для людей, ищущих более точные рассуждения, помимо решения проблемы с базой данных, которая никогда не использует их
источник
Просто еще одно решение с использованием
datetime
модуля для Python 3.источник