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)); }
до свидания