DateTime에 PHP 타임 스탬프


94

이것을 strtotime 또는 비슷한 유형의 값으로 변환하여 DateTime 개체 에 전달하는 방법을 알고 있습니까?

내가 가진 날짜 :

Mon, 12 Dec 2011 21:17:52 +0000

내가 시도한 것 :

$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));

$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');

위의 내용은 올바르지 않습니다. 많은 다른 날짜를 반복하면 모두 같은 날짜입니다.

답변:


163

DateTime객체 를 생성하기 위해 문자열을 타임 스탬프로 바꿀 필요 가 없습니다. 날짜 문자열을 DateTime생성자에있는 그대로 제공 할 수 있습니다 .

// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);

즉, 문자열 대신 사용하려는 타임 스탬프가있는 경우 다음을 사용하여 수행 할 수 있습니다 DateTime::setTimestamp().

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);

수정 (2014-05-07) :

실제로 당시에는 이것을 알지 못했지만 DateTime생성자 타임 스탬프에서 직접 인스턴스 생성을 지원합니다. 이 문서 에 따르면 타임 스탬프 앞에 @문자를 추가하기 만하면됩니다 .

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);

이것은 훌륭하게 작동합니다. 나는 이것을 전에 시도했지만 충분한 기회를주지 않았 음에 틀림 없다 !!! 감사합니다 :))
JREAM

18
참고 new DateTime('@' . $timestamp)$dt = new DateTime(); $dt->setTimestamp($timestamp)시간대와 같은 방식으로 취급하지 않습니다. 자세한 내용은 @ stackoverflow.com/questions/12038558/… 내 대답 을 참조하십시오.
John Slegers 2016

42

@drrcknlsn 은 시간 문자열을 데이터 시간으로 변환하는 여러 가지 방법이 있다고 주장 하는 것이 옳지 만, 이러한 다른 방법이 동일한 방식으로 시간대를 처리하지 않는다는 점을 인식하는 것이 중요합니다.


옵션 1 : DateTime('@' . $timestamp)

다음 코드를 고려하십시오.

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

strtotime비트는 시간대 정보를 제거하고, date_create기능이 GMT를 가정합니다 ( Europe/Brussels).

따라서 어떤 서버에서 실행하더라도 출력은 다음과 같습니다.

2011-12-12T13:17:52+00:00

옵션 2 : date_create()->setTimestamp($timestamp)

다음 코드를 고려하십시오.

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

이것이 동일한 출력을 생성 할 것으로 예상 할 수 있습니다. 그러나 벨기에 서버에서이 코드를 실행하면 다음과 같은 출력이 나타납니다.

2011-12-12T14:17:52+01:00

date_create함수 와 달리이 setTimestamp방법은 'Europe/Brussels'GMT가 아닌 서버의 시간대 ( 제 경우)를 가정합니다 .


시간대를 명시 적으로 설정

출력이 입력의 시간대와 일치하는지 확인하려면 명시 적으로 설정하는 것이 가장 좋습니다.

다음 코드를 고려하십시오.

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')

이제 다음 코드도 고려하십시오.

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')

입력의 시간대와 일치하도록 출력의 시간대를 명시 적으로 설정했기 때문에 둘 다 동일한 (올바른) 출력을 생성합니다.

2011-12-12T21:17:52+08:00

27

아마도 가장 간단한 해결책은 다음과 같습니다.

DateTime::createFromFormat('U', $timeStamp);

여기서 'U'는 Unix 시대를 의미합니다. 문서 참조 : http://php.net/manual/en/datetime.createfromformat.php


2
이 방법은 또한 시간대를 무시합니다
Bouke Versteegh

2
@BoukeVersteegh와 어느 것이 그렇지 않습니까?
forsberg

2
@BoukeVersteegh 이것은 유닉스 타임 스탬프입니다!, 그것은 객체를 생성하는 동안 시간대 문제에서 당신을 해방시킵니다 . ->setTimezone전화하기 전에 원하는 시간대를 설정 하기 위해 사용 하세요->format()
Accountant م

1
@BoukeVersteegh PHP 매뉴얼 에서이 큰 메모를 확인하십시오. "$ time 매개 변수가 UNIX 타임 스탬프 (예 : @ 946684800)이거나 시간대 (예 : 2010-01-28T15 : 00 : 00 + 02 : 00). "
Accountant م

1
Unix 타임 스탬프에는 시간대가 없으며 정의상 항상 UTC입니다
the_nuts

0

내 해결책입니다.

    function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s")
    {
        $date = new DateTime($date, new DateTimeZone($from));
        $date->setTimeZone(new DateTimeZone($to));
        return $date->format($targetFormat);
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.