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

time() в секундах – есть ли один миллисекунды?

    Короткий ответ :

     $milliseconds = round(microtime(true) * 1000); 

    Используйте microtime() . Эта функция возвращает строку, разделенную пробелом. Первая часть – дробная часть секунд, вторая часть – неотъемлемая часть. Перейдите в true чтобы получить как число:

     var_dump(microtime()); // string(21) "0.89115400 1283846202" var_dump(microtime(true)); // float(1283846202.89) 

    Остерегайтесь прецизионных потерь, если вы используете microtime(true) .

    Существует также gettimeofday() который возвращает часть микросекунды как целое число.

     var_dump(gettimeofday()); /* array(4) { ["sec"]=> int(1283846202) ["usec"]=> int(891199) ["minuteswest"]=> int(-60) ["dsttime"]=> int(1) } */ 

    Как и другие, вы можете использовать microtime() для получения миллисекундной точности на microtime() времени.

    Из ваших комментариев вы, похоже, хотите, чтобы это была высокоточная отметка времени UNIX. Что-то вроде DateTime.Now.Ticks в мире .NET.

    Для этого вы можете использовать следующую функцию:

     function millitime() { $microtime = microtime(); $comps = explode(' ', $microtime); // Note: Using a string here to prevent loss of precision // in case of "overflow" (PHP converts it to a double) return sprintf('%d%03d', $comps[1], $comps[0] * 1000); } 

    Короткий ответ:

    Только 64-битные платформы!

     function milliseconds() { $mt = explode(' ', microtime()); return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000)); } 

    Длительный ответ:

    Если вы хотите получить эквивалентную функцию time() в миллисекундах, сначала нужно учитывать, что по мере того, как time() возвращает количество секунд, прошедших со времени «эпохи» (01/01/1970), количество миллисекунд с «эпохи» time "является большим числом и не вписывается в 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 миллисекунду больше, чем правильный результат. Это связано с ограниченной точностью типа float ( microtime(true) возвращает float). В любом случае, если вы по-прежнему предпочитаете более короткий round(microtime(true)*1000); Я бы предложил лить в результат.


    Даже если это выходит за рамки вопроса, стоит упомянуть, что если ваша платформа поддерживает 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)); } 

    Используйте microtime(true) в PHP 5 или следующую модификацию в PHP 4:

     array_sum(explode(' ', microtime())); 

    Портативный способ написать этот код:

     function getMicrotime() { if (version_compare(PHP_VERSION, '5.0.0', '<')) { return array_sum(explode(' ', microtime())); } return microtime(true); } 

    попробуй это:

     public function getTimeToMicroseconds() { $t = microtime(true); $micro = sprintf("%06d", ($t - floor($t)) * 1000000); $d = new DateTime(date('Ymd H:i:s.' . $micro, $t)); return $d->format("Ymd H:i:su"); } 
     $timeparts = explode(" ",microtime()); $currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000)); echo $currenttime; 

    ПРИМЕЧАНИЕ. Для этой функции требуется PHP5 из-за улучшений с microtime (), а также необходим математический модуль bc (поскольку мы имеем дело с большими числами, вы можете проверить, есть ли у вас модуль в phpinfo).

    Надеюсь, это поможет вам.

    echo date('Ymd H:i:s.') . gettimeofday()['usec'];

    вывод:

    2016-11-19 15:12:34.346351

     $the_date_time = new DateTime($date_string); $the_date_time_in_ms = ($the_date_time->format('U') * 1000) + ($the_date_time->format('u') / 1000); 

    Это работает, даже если вы на 32-битном PHP:

     list($msec, $sec) = explode(' ', microtime()); $time_milli = $sec.substr($msec, 2, 3); // '1491536422147' $time_micro = $sec.substr($msec, 2, 6); // '1491536422147300' 

    Обратите внимание, что это не дает вам целые числа, а строки. Однако это хорошо работает во многих случаях, например, при создании URL-адресов для запросов REST.

    Если вам нужны целые числа, требуется 64-битный PHP.

    Затем вы можете повторно использовать приведенный выше код и использовать для (int):

     list($msec, $sec) = explode(' ', microtime()); // these parentheses are mandatory otherwise the precedence is wrong! // ↓ ↓ $time_milli = (int) ($sec.substr($msec, 2, 3)); // 1491536422147 $time_micro = (int) ($sec.substr($msec, 2, 6)); // 1491536422147300 

    Или вы можете использовать хорошие оль-лайнеры:

     $time_milli = (int) round(microtime(true) * 1000); // 1491536422147 $time_micro = (int) round(microtime(true) * 1000000); // 1491536422147300 

    Использовать это:

     function get_millis(){ list($usec, $sec) = explode(' ', microtime()); return (int) ((int) $sec * 1000 + ((float) $usec * 1000)); } 

    до свидания