2010-09-07 3 views
221

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

+3

Luck вопросы на SO также – prograshid

+1

As часто бывает так, я думаю, что большинство из них будет **, потому что ** он спросил это, а не *** как *** он спросил об этом. –

ответ

69

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

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

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

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

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

Так вообще говоря, 'microtime()' равно '1000 * time()', правильно? – COMer

+0

@COMer: Не совсем. См. Обновление. – kennytm

+0

Я вижу, могут быть ошибки, но ошибка должна быть меньше, чем '1000', правильно? – COMer

34

Как другие заявляли, вы можете использовать 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); 
} 
+1

Точно, что нужно. – shamittomar

+0

Вот как это сделать! – tonix

+0

perrrrrrfect .. ♥. –

11

Использование 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); 
} 
342

короткий ответ является:

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

@FredrikWendt, я думаю, вы сбиваете с толку 'time()'. 'microtime (true)', с другой стороны, возвращает текущее время в секундах с эпохи Unix с точностью до ближайшей микросекунды (см. ссылку PHP). На самом деле очень легко проверить, выполняете ли вы вышеуказанный код в цикле и показываете миллисекунды. –

+5

Я абсолютно сделал! :-) –

+8

Мне нравится короткий ответ. –

-2

Используйте это:

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

Bye

26

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

64 бит платформы!

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

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

Если вы хотите функцию equilvalent из 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);

Другими словами подписанную целое есть место для хранения в отрезок времени более 200 тысяч лет, измеренный в микросекундах.

Вы можете иметь того

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

Почему не просто: '' функция getMilliEpoch() { $ mt = explode ('', microtime()); return $ mt [1]. substr ($ mt [0], 0, 5) * 1000; } ' – Michael

4
$timeparts = explode(" ",microtime()); 
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000)); 
echo $currenttime; 

Примечание: PHP5 требуется для этой функции из-за улучшения с микропорой() и модулем Ьса математики также требуется (как мы имея дело с с большим количеством номеров, вы можете проверить, есть ли у вас модуль в phpinfo).

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

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

На самом деле это похоже на заполнение трех нулей справа? – Zeeshan

+0

Совсем нет. Он преобразует обе части в миллисекунды и дает сумму. Так что это более точно, чем добавлять нули. – user3767296

+0

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! –

5

попробовать это:

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"); 
} 
3

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

выход:

2016-11-19 15:12:34.346351

+0

Используется та же метка времени: '$ t = gettimeofday(); echo date ('Y-m-d H: i: s.', $ t ['sec']). $ Т [ 'мксек']; ' –

1

Это работает, даже если вы на 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 является обязательным.

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

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 
Смежные вопросы