source

PHP 타임스탬프를 DateTime에 입력

gigabyte 2023. 2. 6. 23:40
반응형

PHP 타임스탬프를 DateTime에 입력

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

위의 내용은 올바르지 않습니다.많은 다른 날짜들을 훑어보면 모두 같은 날짜야.

스트링을 타임스탬프로 변환하지 않아도 됩니다.DateTime오브젝트(사실 컨스트럭터에서는 이 작업을 수행할 수 없습니다).날짜 문자열을 에 입력하기만 하면 됩니다.DateTime컨스트럭터 현황:

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

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

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

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


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

다음 코드를 고려합니다.

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

strtotime비트는 타임존 정보를 삭제하고date_create함수는 GMT를 상정하고 있습니다.

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

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기능,setTimestampmethod는 GMT가 아닌 서버(이 경우는 CET)의 타임존을 상정하고 있습니다.


시간대 명시 설정

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

다음 코드를 고려합니다.

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

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

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

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

이것이 저의 해결책입니다.

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

언급URL : https://stackoverflow.com/questions/12038558/php-timestamp-into-datetime

반응형