밀리 초에서 마이크로 초를 포함하여 형식이 지정된 날짜를 가져 오려고합니다.
유일한 문제는 계속 000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
전의. 07-28-2013 11 : 26 : 14.000000
밀리 초에서 마이크로 초를 포함하여 형식이 지정된 날짜를 가져 오려고합니다.
유일한 문제는 계속 000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
전의. 07-28-2013 11 : 26 : 14.000000
답변:
php.net 말한다 :
마이크로 초 (PHP 5.2.2에 추가됨). 참고
date()
항상 생성000000
은 정수 매개 변수를 사용하기 때문에 반면,DateTime::format()
경우 지원 마이크로 않습니다DateTime
마이크로 만들었습니다.
따라서 간단하게 사용하십시오.
$micro_date = microtime();
$date_array = explode(" ",$micro_date);
$date = date("Y-m-d H:i:s",$date_array[1]);
echo "Date: $date:" . $date_array[0]."<br>";
dateTime()
참조 된 권장 및 사용 클래스 :
$t = microtime(true);
$micro = sprintf("%06d",($t - floor($t)) * 1000000);
$d = new DateTime( date('Y-m-d H:i:s.'.$micro, $t) );
print $d->format("Y-m-d H:i:s.u"); // note at point on "u"
참고 사항 u
은 마이크로 초입니다 (1 초 = 1000000µs).
php.net의 또 다른 예 :
$d2=new DateTime("2012-07-08 11:14:15.889342");
의 기준 dateTime()
에 php.net
저자에게는 짧고 단순화 된 질문에 답했습니다. 작성자에 대한 자세한 정보 는 밀리 초에서 날짜 형식 mdY H : i : su 가져 오기 를 참조하십시오 .
microtime(false)
둘 다 작동하지 않습니다 .)
2012-07-08 11:14:15.0.889342
입력 형식으로이 작업을 쉽게 수행 할 수 있습니다 U.u
.
$now = DateTime::createFromFormat('U.u', microtime(true));
echo $now->format("m-d-Y H:i:s.u");
그러면 다음과 같은 출력이 생성됩니다.
04-13-2015 05:56:22.082300
날짜 형식에 대한 PHP 매뉴얼 페이지에서 :
http://php.net/manual/en/function.date.php
내 원래 답변의 결함을 지적한 giggsey에게 감사드립니다 number_format()
. 안타깝게도 더 이상 우아하게 느껴지지 않습니다 ...
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
http://php.net/manual/en/function.number-format.php
DaVe에 대한 응답으로 시간대에 대한 메모.
일반적으로 createFromFormat()
방법은 지정되지 않은 경우 현지 시간대를 사용합니다.
http://php.net/manual/en/datetime.createfromformat.php
그러나 여기에 설명 된 기술 microtime()
은 Unix Epoch (1970 년 1 월 1 일 00:00:00 GMT) 이후 경과 된 시간 (초)을 반환 하는 DateTime 객체를 초기화하는 것 입니다.
http://php.net/manual/en/function.microtime.php
즉, DateTime 개체가 암시 적으로 UTC로 초기화되어 경과 시간을 추적하려는 서버 내부 작업에 적합합니다.
특정 시간대의 시간을 표시해야하는 경우 그에 따라 설정해야합니다. 그러나 이것은 위에서 논의 된 이유 때문에 초기화 ( 의 세 번째 매개 변수를 사용 하지 않음) 후 별도의 단계로 수행해야합니다 createFromFormat()
.
이 setTimeZone()
방법을 사용하여이 요구 사항을 충족 할 수 있습니다.
http://php.net/manual/en/datetime.settimezone.php
예로서:
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
echo $now->format("m-d-Y H:i:s.u") . '<br>';
$local = $now->setTimeZone(new DateTimeZone('Australia/Canberra'));
echo $local->format("m-d-Y H:i:s.u") . '<br>';
다음 출력을 생성합니다.
10-29-2015 00:40:09.433818
10-29-2015 11:40:09.433818
mysql에 입력하려면 시간 형식이 다음과 같아야합니다.
format("Y-m-d H:i:s.u")
DateTime::createFromFormat('U.u', microtime(true));
되면 false를 반환 microtime(true)
합니다. '1438616239.000000'대신 '1438616239'를 반환합니다.
number_format
이 정확한 두번째에없는 때에도, 항상 필요하다. 그렇지 않으면 precision
PHP 구성 옵션 ( "디스플레이"용)을 사용할 수 있습니다.이 옵션은 기본적으로 PHP 7.0 기준으로 충분히 높지 않아 정밀도 손실 (마이크로 초까지 정확하지 않음)을 유발합니다.
여기에 약간 더 짧은 접근 방식이 있습니다. 고정밀 숫자 날짜 / 시간을 생성하는 대신 마이크로 초 값을 문자열로 변환하고을 제거한 0
다음 날짜 / 시간 문자열 끝에 추가합니다. 문자열 길이 매개 변수를 조정하여 소수 자릿수를 쉽게자를 수 있습니다. 여기서는 4
밀리 초를 얻는 데 사용 하지만 7
마이크로 초를 얻는 데 사용할 수 있습니다 .
$t = explode(" ",microtime());
echo date("m-d-y H:i:s",$t[1]).substr((string)$t[0],1,4);
의 microtime () 값의 0.98236000 1407400573
경우를 반환합니다 08-07-14 01:08:13.982
.
echo date('m-d-Y H:i:s').substr(fmod(microtime(true), 1), 1);
예제 출력 :
02-06-2019 16:45:03.53811192512512
소수점 이하 자릿수를 제한해야하는 경우 아래 줄 (credit mgutt)이 좋은 대안이 될 것입니다. (아래 코드에서 6은 소수점 이하 자릿수를 6으로 제한합니다.)
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));
예제 출력 :
02-11-2019 15:33:03.624493
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));
. 필요한 이유 설명 09
: stackoverflow.com/a/28739819/318765
echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
substr()
. 그리고 round()
그것 과 보완 적으로 후행 0을 잘라낼 것입니다 : stackoverflow.com/questions/7493305/… 그것이 제가 sprintf()
.
(new Date()).toISOString()
어떤 이유로 JavaScript와 같은 날짜 형식을 지정 하려면 PHP에서 다음 과 같이 할 수 있습니다.
$now = microtime(true);
gmdate('Y-m-d\TH:i:s', $now).sprintf('.%03dZ',round(($now-floor($now))*1000));
샘플 출력 :
2016-04-27T18:25:56.696Z
정수를 빼도 소수점 이하 자릿수의 정확도가 떨어지지 않음을 증명하기 위해 :
>>> number_format(123.01234567890123456789,25)
=> "123.0123456789012408307826263"
>>> number_format(123.01234567890123456789-123,25)
=> "0.0123456789012408307826263"
PHP 는 소수점 자리를 반올림했지만 두 경우 모두 같은 방식으로 반올림했습니다.
date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));
?
$time
이미 밀리 초 단위이면 기술적으로 작동합니다. substr
해킹이 마음에 들지 않지만 2001 년에서 2286 년 사이의 날짜에 작동 할 것 같습니다.
$time
MS입니다.하지만 2286
왜 그렇게 생각하고 그러한 상황에서 벗어나는 것이 가능할까요?
이것은 ArchCodeMonkey의 답변을 기반으로합니다.
하지만 빠르게 작동하는 것을 원하면 간단합니다.
function DateTime_us_utc(){
return DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
}
function DateTime_us(){
$now = DateTime_us_utc();
return $now->setTimeZone(new DateTimeZone(date_default_timezone_get()));
}
그래서 나를 위해
$now = DateTime_us();
$now->format("m-d-Y H:i:s.u");
PHP 7.1부터 간단하게 다음과 같이 할 수 있습니다.
$date = new DateTime( "NOW" );
echo $date->format( "m-d-Y H:i:s.u" );
다음과 같이 표시됩니다.
04-11-2018 10:54:01.321688
문서는 다음과 같이 말합니다.
마이크로 초 (PHP 5.2.2에 추가됨). date ()는 정수 매개 변수를 사용하므로 항상 000000을 생성하지만 DateTime :: format ()은 마이크로 초를 지원합니다.
즉, 대신 DateTime을 사용하십시오.
new DateTime()
는 u에 대해 0000을 반환합니다. 그러나 인스턴스화 할 때 마이크로 초 정확도의 시간을 제공하면 정상적으로 작동합니다.
new DateTime( 'Y-m-d H:i:s.'.$micro);
이제 PHP 7.0 이상으로 다음을 수행 할 수 있습니다.
$dateString = substr($millseconds_go_here,0,10);
$drawDate = new \DateTime(Date('Y-m-d H:i',$dateString));
$drawDate->setTimezone(new \DateTimeZone('UTC'));
다음을 순서대로 수행합니다.
Date()
날짜를 처리 할 수 있도록 문자열에서 마지막 4 개의 0을 잘라냅니다 .DateTime()
그런 다음 현재있는 시간대를 수정할 수 있지만 date_default_timezone_set("Timezone");
사용하기 전에 설정되어 있는지 확인하십시오.DateTime()
함수와 클래스 .DateTime()
클래스 나 함수를 사용할 때 올바른 시간대에 있는지 확인하려면 클래스에서 생성자를 사용하는 것이 좋습니다 .나는 몇 가지 다른 방법을 제시했다.
1) 마이크로 타임 + sscanf + 날짜 :
sscanf(microtime(), '0.%6s00 %s', $usec, $sec);
$date = date('Y-m-d H:i:s.', $sec) . $usec;
microtime ()이 마이크로 초 부분에 대해 10 자 (0.dddddd00)를 반환하는 이유를 잘 모르겠지만 누군가 나에게 말할 수 있습니까?
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { sscanf(microtime(), '0.%6s00 %s', $usec, $sec); $date = date('Y-m-d H:i:s.', $sec) . $usec; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "22372.335910797 ms" // macOS PHP 5.6.30
string(18) "16772.964000702 ms" // Linux PHP 5.4.16
string(18) "10382.229089737 ms" // Linux PHP 7.3.11 (same linux box as above)
2) DateTime :: createFromFormat + Datetime-> 형식 :
$now = new DateTime('NOW');
$date = $now->format('Y-m-d H:i:s.u');
PHP 5.x에서 작동하지 않습니다 ...
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = new DateTime('NOW'); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "45801.825046539 ms" // macOS PHP 5.6.30 (ms not working)
string(18) "21180.155038834 ms" // Linux PHP 5.4.16 (ms not working)
string(18) "11879.796028137 ms" // Linux PHP 7.3.11 (same linux box as above)
3) gettimeofday + 날짜 :
$time = gettimeofday();
$date = date('Y-m-d H:i:s.', $time['sec']) . $time['usec'];
-
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $time = gettimeofday(); $date = date('Y-m-d H:i:s.', $time['sec']) . $time['usec']; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "23706.788063049 ms" // macOS PHP 5.6.30
string(18) "14984.534025192 ms" // Linux PHP 5.4.16
string(18) "7799.1390228271 ms" // Linux PHP 7.3.11 (same linux box as above)
4) 마이크로 타임 + number_format + DateTime :: createFromFormat + DateTime-> format :
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
$date = $now->format('Y-m-d H:i:s.u');
-
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', '')); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "83326.496124268 ms" // macOS PHP 5.6.30
string(18) "61982.603788376 ms" // Linux PHP 5.4.16
string(16) "19107.1870327 ms" // Linux PHP 7.3.11 (same linux box as above)
5) 마이크로 타임 + sprintf + DateTime :: createFromFormat + DateTime-> format :
$now = DateTime::createFromFormat('U.u', sprintf('%.6f', microtime(true)));
$date = $now->format('Y-m-d H:i:s.u');
-
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = DateTime::createFromFormat('U.u', sprintf('%.6f', microtime(true))); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "79387.331962585 ms" // macOS PHP 5.6.30
string(18) "60734.437942505 ms" // Linux PHP 5.4.16
string(18) "18594.941139221 ms" // Linux PHP 7.3.11 (same linux box as above)