PHP에서 현재 시간을 밀리 초 단위로 얻는 방법은 무엇입니까?


답변:


506

짧은 대답 입니다 :

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

26
@FredrikWendt, 나는 당신이 혼란 스럽다고 생각합니다 time(). microtime(true)반면에 유닉스 시대는 가장 가까운 마이크로 초까지 정확하기 때문에 현재 시간을 초 단위로 반환합니다 (PHP 참조). 위의 코드를 루프로 실행하고 밀리 초를 표시하면 실제로 테스트하기가 매우 쉽습니다.
laurent December

6
나는 절대적으로했다! :-)
Fredrik Wendt

9
나는 짧은 대답을 좋아한다.
Erick Robertson

9
그렇게하지 않아야합니까 microtime(true) / 1000(연산 대신 분할)?
Jordan Lev

18
@JordanLev, microtime (true)는 Unix 타임 스탬프를 초 단위 로 부동 소수점으로 반환하므로 곱셈이어야합니다 .
laurent

88

사용하십시오 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(), 맞죠?
COMer

나는 오류가있을 수 있지만 오류는 미만이어야합니다 1000.
COMer

@COMer : 어떤 변형을 이야기하고 있습니까?
kennytm

microtime(true)그리고1000*time()
COMer

@ COMer : 1000*time()밀리 초를주지 않습니다. 14 자리의 정밀도를 가진를 microtime(true)반환합니다 float. 초 부분은 이미 10을 취하여 마이크로 초 부분에 4 자리를 남겼습니다. 밀리 초에는 3 자리 숫자 만 있으면되므로 충분합니다.
kennytm

46

짧은 답변:

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

그런 다음 소수점을 곱하고 10000으로 반올림 한 소수 부분을 더합니다.

1409263371904

참고 그 모두 $mt[1]와의 결과 round로 주조된다 int. 이것은 floats 이기 때문에 필요 하며 캐스트하지 않고 조작하면 함수가을 리턴합니다 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));
}

왜 안될까요 :`function getMilliEpoch () {$ mt = explode ( '', microtime ()); $ mt [1]을 반환합니다. substr ($ mt [0], 0, 5) * 1000; }`
Michael

이제 microtime 함수에 대한 매개 변수가 있습니다. true로 설정하면 1970 년 1 월 1 일 이후 초와 밀리 초를 리턴합니다 (0 시간 0 분 0 초). 다음은 예입니다 : microtime (true) // 1553260455.7242
kukko

@kukko 네, 그러나 float 형식의 정밀도제한되어 있기 때문에 마이크로 타임 (true)에서 밀리 소 나드 수를 계산하면 약간 부정확 한 값
Paolo

42

다른 사람이 말했듯이 사용할 수 있습니다 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);
}

그렇게하는 방법입니다!
tonix

1
perrrrrrfect .. ♥.
SRB가

서버 시간을 반환하지 않습니까? 제 경우에는 저장된 시간이 db의 로컬 브라우저 시간이라는 것을 알 수 있습니다. 서버 시간대가 EST + 3이고 브라우저 시간이 GMT + 6이라고 가정합니다. GMT + 6 위치에서 양식을 제출하는 동안 저장된 시간이 GMT + 6에 해당하는 밀리 초입니다. 그래서 무엇이 문제입니까? :(
Zenith

12

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

11

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

산출:

2016-11-19 15:12:34.346351


1
이것은 같은 타임 스탬프를 사용합니다 :$t = gettimeofday(); echo date('Y-m-d H:i:s.',$t['sec']) . $t['usec'];
Savvas Radevic

마이크로 초는 0으로 채워 져야합니다.$timeofday=gettimeofday(); echo sprintf("%s.%06d", date('Y-m-d H:i:s', $timeofday['sec']), $timeofday['usec']);
mabi

7

이 시도:

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

6

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

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

참고 : microtime ()의 개선으로 인해이 함수에 PHP5가 필요하고 bc math 모듈도 필요합니다 (많은 수를 다루므로 phpinfo에 모듈이 있는지 확인할 수 있습니다).

이것이 당신을 돕기를 바랍니다.


5
$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

1
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자에게 질문에 대한 답변을 제공하고 있으며 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다. 설명 주석으로 코드를 복잡하게 만들지 마십시오. 코드와 설명의 가독성이 떨어집니다!
Michał Perłakowski

1

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 

1
PHP <7.1에서 새로운 DateTime () 마이크로 초는 항상 0 입니다. php.net/manual/en/migration71.incompatible.php 참조하십시오 .
mabi

-2

이것을 사용하십시오 :

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

안녕

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.