답변:
짧은 대답 입니다 :
$milliseconds = round(microtime(true) * 1000);
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()
같음을 1000*time()
, 맞죠?
1000
.
microtime(true)
그리고1000*time()
1000*time()
밀리 초를주지 않습니다. 14 자리의 정밀도를 가진를 microtime(true)
반환합니다 float
. 초 부분은 이미 10을 취하여 마이크로 초 부분에 4 자리를 남겼습니다. 밀리 초에는 3 자리 숫자 만 있으면되므로 충분합니다.
64 비트 플랫폼 만!
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
[ 64 비트 PHP를 실행하면 상수는 다음과 PHP_INT_SIZE
같습니다8
]
time()
밀리 초 단위 의 등가 함수를 원할 경우 time()
"에포크 시간"(01/01/1970) 이후 경과 된 시간 (초) 을 반환 할 때 "에포크 시간" 이후 의 밀리 초 수는 큰 숫자 임을 고려해야합니다. 32 비트 정수에는 맞지 않습니다.
PHP에서 정수의 크기는 플랫폼에 따라 32 또는 64 비트 일 수 있습니다.
에서 http://php.net/manual/en/language.types.integer.php
정수의 크기는 플랫폼에 따라 다르지만 최대 약 20 억 개의 값이 일반적인 값 (32 비트 부호)입니다. 64 비트 플랫폼은 보통 최대 32 비트 인 Windows를 제외하고 최대 약 9E18입니다. PHP는 부호없는 정수를 지원하지 않습니다. 정수 크기는 PHP_INT_SIZE 상수를 사용하여, PHP 4.4.0 및 PHP 5.0.5 이후 PHP_INT_MAX 상수를 사용하여 최대 값을 결정할 수 있습니다.
64 비트 정수가있는 경우 다음 기능을 사용할 수 있습니다.
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
microtime()
"epoch time"이후 초 단위의 숫자를 공백으로 분리 된 두 개의 숫자를 사용하여 최대 마이크로 초까지 정확하게 반환합니다.
0.90441300 1409263371
두 번째 숫자는 초 (정수)이고 첫 번째 숫자는 소수입니다.
위 함수 milliseconds()
는 정수 부분에 곱한 정수 부분을 취합니다.1000
1409263371000
그런 다음 소수점을 곱하고 1000
0으로 반올림 한 소수 부분을 더합니다.
1409263371904
참고 그 모두 $mt[1]
와의 결과 round
로 주조된다 int
. 이것은 float
s 이기 때문에 필요 하며 캐스트하지 않고 조작하면 함수가을 리턴합니다 float
.
마지막으로, 그 기능은 약간 더 정확합니다
round(microtime(true)*1000);
1:10 (약)의 비율로 올바른 결과보다 1 밀리 초 더 많이 반환합니다. 이것은 float 형식의 정밀도가 제한되어 있기 때문입니다 (float microtime(true)
반환). 어쨌든 당신이 여전히 더 짧은 것을 선호 round(microtime(true)*1000);
한다면 결과에 캐스팅하는 것이 좋습니다 int
.
질문의 범위를 벗어나더라도 플랫폼이 64 비트 정수를 지원하면 오버플로가 발생하지 않고 마이크로 초 단위로 현재 시간을 얻을 수 있다고 언급 할 가치가 있습니다 .
팩트 2^63 - 1
(가장 큰 부호있는 정수)를 10^6 * 3600 * 24 * 365
(1 년에 대략 마이크로 초 )로 나눈 값 이 주어진 경우 292471
.
그것은 당신이 얻는 것과 같은 가치입니다
echo (int)( PHP_INT_MAX / ( 1000000 * 3600 * 24 * 365 ) );
다시 말해, 부호있는 64 비트 정수는 마이크로 초로 측정 된 200,000 년 이상의 시간 범위를 저장할 공간이 있습니다.
당신은 그때
function microseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000));
}
다른 사람이 말했듯이 사용할 수 있습니다 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);
}
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);
}
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
산출:
2016-11-19 15:12:34.346351
$t = gettimeofday(); echo date('Y-m-d H:i:s.',$t['sec']) . $t['usec'];
$timeofday=gettimeofday(); echo sprintf("%s.%06d", date('Y-m-d H:i:s', $timeofday['sec']), $timeofday['usec']);
32 비트 PHP를 사용하는 경우에도 작동합니다.
list($msec, $sec) = explode(' ', microtime());
$time_milli = $sec.substr($msec, 2, 3); // '1491536422147'
$time_micro = $sec.substr($msec, 2, 6); // '1491536422147300'
이것은 정수가 아니라 문자열을 제공합니다. 그러나 이것은 REST 요청에 대한 URL을 빌드 할 때와 같이 많은 경우에 잘 작동합니다.
정수가 필요한 경우 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
또는 좋은 ol 'one-liners를 사용할 수 있습니다.
$time_milli = (int) round(microtime(true) * 1000); // 1491536422147
$time_micro = (int) round(microtime(true) * 1000000); // 1491536422147300
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
($the_date_time->format('u') / 1000);
PHP 5.2.2 <
$d = new DateTime();
echo $d->format("Y-m-d H:i:s.u"); // u : Microseconds
PHP 7.0.0 <7.1
$d = new DateTime();
echo $d->format("Y-m-d H:i:s.v"); // v : Milliseconds
time()
.microtime(true)
반면에 유닉스 시대는 가장 가까운 마이크로 초까지 정확하기 때문에 현재 시간을 초 단위로 반환합니다 (PHP 참조). 위의 코드를 루프로 실행하고 밀리 초를 표시하면 실제로 테스트하기가 매우 쉽습니다.