Краткий ответ:
Только для 64-битных платформ!
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
Длинный ответ:
Если вы хотите сначала получить эквивалентную функцию time()
в миллисекундах, вы должны учитывать, что time()
возвращает количество секунд, прошедших с момента "времени эпохи" (01/01/ 1970), число миллисекунд , поскольку "время эпохи" является большим числом и не вписывается в 32-разрядное целое число.
Размер целого числа в PHP может быть32 или 64 бита, в зависимости от платформы.
с http://php.net/manual/en/language.types.integer.php
Размер целого зависит от платформы, хотя максимальное значение около двух миллиардов является обычным значением (это подписано 32 бита).Максимальное значение для 64-разрядных платформ обычно составляет около 9E18, за исключением Windows, которая всегда является 32-разрядной.PHP не поддерживает целые числа без знака.Целочисленный размер можно определить с помощью константы PHP_INT_SIZE, а максимальное значение - с помощью константы PHP_INT_MAX, начиная с PHP 4.4.0 и PHP 5.0.5.
Если у вас 64-разрядные целые числа, вы можете использовать следующую функцию:
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
microtime()
возвращает количество секунд, прошедших с «времени эпохи», с точностью домикросекунды с двумя числами, разделенными пробелом, например ...
0.90441300 1409263371
Второе число - это секунды (целые числа), которым предшествует десятичная часть.
Функция milliseconds
принимает целое числочасть умножается на 1000
1409263371000
и добавляет десятичную часть, умноженную на 1000
и округленную до 0 десятичных знаков
1409263371904
Обратите внимание, что и $mt[1]
, и результат round
приводятся к int
.Это необходимо, поскольку они равны float
с, и операция с ними без приведения приведет к тому, что функция вернет float
.
Наконец, эта функция немного более точна, чем
round(microtime(true)*1000);
, что с соотношением 1:10 (приблиз.) Возвращает на 1 миллисекунду больше, чем правильный результат.Это связано с ограниченной точностью типа с плавающей точкой (microtime(true)
возвращает значение с плавающей точкой).В любом случае, если вы все еще предпочитаете более короткий round(microtime(true)*1000);
, я бы предложил привести к int
результату.
Даже если это выходит за рамки вопроса, стоит упомянуть, что если ваша платформа поддерживает 64-битные целые числазатем вы также можете получить текущее время в микросекундах без возникновения переполнения.
Если факт 2^63
(приблизительно наибольшее целое число со знаком), разделенное на 10^6 * 3600 * 24 * 365
(приблизительно микросекунды)в один год) дает ок.292471
.
Это то же значение, которое возвращает echo PHP_INT_MAX / (1000000*3600*24*365);
Другими словами, целое число со знаком может хранить промежуток времени более 200000 лет, измеренный в микросекундах.
Возможно, у вас естьтогда
function microseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000));
}