Как узнать текущее время в миллисекундах в PHP? - PullRequest
287 голосов
/ 07 сентября 2010

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

Ответы [ 11 ]

440 голосов
/ 11 июля 2012

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

$milliseconds = round(microtime(true) * 1000);
81 голосов
/ 07 сентября 2010

Использование 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)
}
*/
40 голосов
/ 07 сентября 2010

Как уже говорилось, вы можете использовать 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);
}
38 голосов
/ 29 августа 2014

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

Только для 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));
}
11 голосов
/ 07 сентября 2010

Используйте 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);
}
8 голосов
/ 19 ноября 2016

echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];

выход:

2016-11-19 15:12:34.346351

7 голосов
/ 16 ноября 2015

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

public function getTimeToMicroseconds() {
    $t = microtime(true);
    $micro = sprintf("%06d", ($t - floor($t)) * 1000000);
    $d = new DateTime(date('Y-m-d H:i:s.' . $micro, $t));

    return $d->format("Y-m-d H:i:s.u"); 
}
5 голосов
/ 07 апреля 2017

Это работает, даже если вы используете 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
5 голосов
/ 30 июля 2015
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
    ($the_date_time->format('u') / 1000);
5 голосов
/ 03 ноября 2014
$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;

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

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

...