밀리 초에서 날짜 형식 mdY H : i : su 가져 오기


117

밀리 초에서 마이크로 초를 포함하여 형식이 지정된 날짜를 가져 오려고합니다.

유일한 문제는 계속 000000

date("m-d-Y H:i:s.u", $milliseconds/1000);

전의. 07-28-2013 11 : 26 : 14.000000


6
질문이 밀리 초 변환을 요청하는 것이 이상 하지만 모두 마이크로 초 변환 방법에 대해 대답합니다. 나는 당신이 둘 사이에서 변환 할 수 있다는 것을 알고 있지만 실제로 PHP 문서 또는 다른 곳에서 관련없는 코드를 복사하여 붙여 넣는 대신 질문에 대답하는 것이 좋습니다.
laurent

나는 그것이 오래 되었다는 것을 알고 있지만, bamossza의 대답 은 내가 여기서 찾은 최고였습니다
Piyin

답변:


122

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 가져 오기 를 참조하십시오 .


4
저는 일반적으로 읽고 이해하기 쉽기 때문에 두 번째 양식을 선택합니다. 또한 DateTime은 날짜 / 시간 함수보다 훨씬 유연하고 강력합니다. 마이크로 초 처리는 적절한 사례입니다.
Herbert

3
@Geo와 AlBundy는 PHP가 5.2.2 미만인 컴퓨터에서 이것을 시도하고 있습니까? PHP 5.4.39은 ... 완벽하게 정상적으로이 실행
RichardBernards

쉽지 않을까요? 날짜 ( 'mdY H : i : s'). (int) microtime (true);
Anant

@Anant, 실제로 매우 쉬울 것입니다. 하지만 틀 렸습니다. ;) 당신이 얻는 것은 초 단위의 신기원입니다. (불행히도 microtime(false)둘 다 작동하지 않습니다 .)
Sz.

이 코드는 모든 로케일에서 올바르게 작동하지 않습니다. 독일과 같은 일부 국가에서는 ".1234"대신 "0,1234"또는 "0.1234"를 작성하므로 코드는 다음과 같은 출력을 제공합니다. 2012-07-08 11:14:15.0.889342
Daniel Marschall

138

입력 형식으로이 작업을 쉽게 수행 할 수 있습니다 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 매뉴얼 페이지에서 :

  • U = Unix Epoch 이후 초
  • u = 마이크로 초

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

19
참고 : 정확한 초에 실행 DateTime::createFromFormat('U.u', microtime(true));되면 false를 반환 microtime(true)합니다. '1438616239.000000'대신 '1438616239'를 반환합니다.
giggsey

1
훌륭한 솔루션입니다. 감사합니다. 마이크로 타임에서 $ now를 만드는 데 내 현지 시간을 잃고있는 것 같습니다. 어떤 생각?
daVe

1
@daVe 시간대에 대한 정보를 추가했습니다. 그게 당신이 추구했던 것이기를 바랍니다.
ArchCodeMonkey

1
number_format이 정확한 두번째에없는 때에도, 항상 필요하다. 그렇지 않으면 precisionPHP 구성 옵션 ( "디스플레이"용)을 사용할 수 있습니다.이 옵션은 기본적으로 PHP 7.0 기준으로 충분히 높지 않아 정밀도 손실 (마이크로 초까지 정확하지 않음)을 유발합니다.
Teoh Han Hui

1
항상 StackOverflow에서 아래로 스크롤
tom10271

15

여기에 약간 더 짧은 접근 방식이 있습니다. 고정밀 숫자 날짜 / 시간을 생성하는 대신 마이크로 초 값을 문자열로 변환하고을 제거한 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.


9

나는 사용하고있다

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

output: 2017-09-05 17:04:57.555036

6
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

정밀도와 선행 0을 몇 초 동안 놓쳤습니다. 따라서 올바른 버전은 echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));. 필요한 이유 설명 09: stackoverflow.com/a/28739819/318765
mgutt

당신은 다시 정밀도를 놓쳤습니다;)echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
mgutt

그러나 조심하십시오 substr(). 그리고 round()그것 과 보완 적으로 후행 0을 잘라낼 것입니다 : stackoverflow.com/questions/7493305/… 그것이 제가 sprintf().
mgutt

@mgutt 언제 첫 번째 숫자가 0이 아닐까요? 기본적으로 필요한 것은 fmod에서 1 씩 나머지를 가져올 때 항상 존재하는 0을 제거하는 것입니다. 질문은 마이크로 초를 요구하지만 초의 소수 자릿수 형태입니다. 소수점 이하 자릿수를 제한 할 이유가 없습니다. 소수점 이하 자릿수가 많을수록 정밀도가 향상됩니다.
ghbarratt

@mgutt 내 답변에 대한 첫 번째 제안 대안을 추가하여 필요한 경우 소수점 이하 자릿수를 제한하는 좋은 방법이라고 설명했습니다.
ghbarratt

3

(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 소수점 자리를 반올림했지만 두 경우 모두 같은 방식으로 반올림했습니다.


1
아니요. 부동 소수점 숫자에 수학을 사용하지 마십시오. 정확하지 않습니다. 또한 여러 함수를 호출하는 데 시간을 낭비하지 마십시오. substr ()을 사용하여 형식화 된 날짜를 소수점 세 자리로 자릅니다.
LS

@LS Truncating은 아마도 더 정확하지 않은 세 번째 십진수를 반올림하지 않습니다. 수레는 아주 작은 정밀도로 들어갈 때까지 분해되지 않습니다. 소수점 3 자리는 괜찮습니다. 사실, 저는 정밀도를 전혀 변경하지 않는다고 생각합니다. 0에 가까워 질수록 수레가 더 정확 해집니다. 정수를 빼도 소수점 이하 자릿수 AFAIK를 변경해서는 안됩니다.
mpen 2016 년

어때 date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));?
F8ER

@ F8ER $time이미 밀리 초 단위이면 기술적으로 작동합니다. substr해킹이 마음에 들지 않지만 2001 년에서 2286 년 사이의 날짜에 작동 할 것 같습니다.
mpen

예, $timeMS입니다.하지만 2286왜 그렇게 생각하고 그러한 상황에서 벗어나는 것이 가능할까요?
F8ER

3

이것은 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");

3

약간 더 우아하고 간단하다고 생각되는 또 다른 방법은 다음과 같습니다.

echo date('Y-m-d-H:i:s.').preg_replace("/^.*\./i","", microtime(true));

1
// Procedural
$fineStamp = date('Y-m-d\TH:i:s') . substr(microtime(), 1, 9);
echo $fineStamp . PHP_EOL;

// Object-oriented (if you must). Still relies on $fineStamp though :-\
$d = new DateTime($fineStamp);
echo $d->format('Y-m-d\TH:i:s.u') . PHP_EOL;

1

PHP 7.1부터 간단하게 다음과 같이 할 수 있습니다.

$date = new DateTime( "NOW" );
echo $date->format( "m-d-Y H:i:s.u" );

다음과 같이 표시됩니다.

04-11-2018 10:54:01.321688

0

문서는 다음과 같이 말합니다.

마이크로 초 (PHP 5.2.2에 추가됨). date ()는 정수 매개 변수를 사용하므로 항상 000000을 생성하지만 DateTime :: format ()은 마이크로 초를 지원합니다.

즉, 대신 DateTime을 사용하십시오.


6
작동하지 않습니다! date_format (new DateTime (), 'u')는 0을 제공합니다 : phpfiddle.org/lite/code/ggh-mvz
Jānis Elmeris 2013 년

위의 답변 (및 내 시험)에 따라 예 new DateTime()는 u에 대해 0000을 반환합니다. 그러나 인스턴스화 할 때 마이크로 초 정확도의 시간을 제공하면 정상적으로 작동합니다.
scipilot

@scipilot 좋아, 어떻게 그렇게합니까?
지오

@Geo는 수락 된 답변을 참조하십시오. new DateTime( 'Y-m-d H:i:s.'.$micro);
scipilot 2014 년

0

이제 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'));

다음을 순서대로 수행합니다.

  1. Date()날짜를 처리 할 수 있도록 문자열에서 마지막 4 개의 0을 잘라냅니다 .
  2. date를 사용하여 밀리 초를 DateTime이 이해할 수있는 날짜 시간 문자열로 형식화합니다.
  3. DateTime()그런 다음 현재있는 시간대를 수정할 수 있지만 date_default_timezone_set("Timezone");사용하기 전에 설정되어 있는지 확인하십시오.DateTime() 함수와 클래스 .
  4. DateTime()클래스 나 함수를 사용할 때 올바른 시간대에 있는지 확인하려면 클래스에서 생성자를 사용하는 것이 좋습니다 .

0

Carbon을 사용하는 경우 정의 된 사양 "RFC3339_EXTENDED"를 사용할 수 있습니다. 또는 사용자 정의하십시오.

Carbon::RFC3339_EXTENDED = 'Y-m-d\TH:i:s.vP';

0

@ArchCodeMonkey 답변을 기반으로합니다.

당신이 경우 declare(strict_types=1)당신은 문자열에 두 번째 인수를 캐스팅해야한다

여기에 이미지 설명 입력


0

나는 몇 가지 다른 방법을 제시했다.

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