2011-04-27 2 views
2
<?php 
$first = '2011-04-27'; 
$second = '2011-04-27 16:20:12'; 
$third = '2011-04-27 16:20:12+00'; 

$dt = new DateTime($first); 
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName())); 
echo $dt->getTimezone()->getName().'<br />'; 
// OK 
$dt = new DateTime($second); 
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName())); 
echo $dt->getTimezone()->getName().'<br />'; 
// OK 
$dt = new DateTime($third); 
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName())); 
echo $dt->getTimezone()->getName().'<br />'; 
// Error 
// ->getName() returns unexpectedly +00, which is not a name, but offset 

날짜 시간 추출물을 정말로 이름입니다 마지막 문자열 시간대 이름+00에서,하지만 을 상쇄하기 때문에 시간대로 설정할 수 없습니다하지 않습니다 ...날짜 시간 :: 된 getTimezone는 시간대의 이름을 반환하지만, 오프셋

이 문제는

public function __sleep() 
{ 
    $this->fix = array($this->format('Y-m-d H:i:s'), $this->getTimezone()->getName()); 
    return array('fix'); 
} 

public function __wakeup() 
{ 
    $this->__construct($this->fix[0], new DateTimeZone($this->fix[1])); 
    unset($this->fix); 
} 

내가 KN ... 때 (드) 직렬화 DateTime 개체 문제를 일으키는 예를 들어 얻는 것이 더 낫습니다. 이 문자열 : 2011-04-27 16:20:12 UTC, 아무튼 메트로가 getName()이라면 이름으로 +00을 반환하지 않습니까?

답변

0

시간대 오프셋이 +00DateTime 개체를 만들려고 했으므로 유효한 시간대 식별자 대신 오프셋이 반환되어 실제로는 GMT+0000을 의미합니다. 오프셋없이 datetime 문자열을 사용하면 DateTime 객체 (또는 시스템)의 현재 시간대 설정에 따라 PHP 시간대 식별자를 얻습니다.

$third = '2011-04-27 16:20:12+00';으로 당신은 ->getName() 방법으로 그것을 다시 반환하는 대신 PHP 식별자 및 DateTimeDateTime 목적의 오프셋 (offset) +00:00을 설정했습니다.

고정 오프셋은 DST 규칙에 대한 정보를 제공하지 않으므로 PHP TimeZone 식별자를 가져 오는 데 사용할 수 없습니다. 예 : 내 구역에있는 순간에 GMT+2 (활성 DST)입니다.하지만 datetime 문자열에 넣으면 DateTime 객체는 내 오프셋이 +1으로 변경 될 때를 알 수 없습니다. 단순히 GMT + 0200입니다. 그게 전부입니다. 귀하의 경우

오프셋 +00은 getName() 메소드 대신 시간대의 오프셋 시간을 반환 이유 등 Atlantic/Reykjavík, Africa/Casablanca, Africa/Nouakchott 같은 다른 시간대 식별자의 많은,

일치!

이것은 공식적인 설명이 아니지만 짧은 버전입니다.

물론 2011-04-27 16:20:12+00은 유효한 datetime 문자열이 아닙니다.

0

코드를 실행할 때 PHP는 해당 형식 (형식이 here으로 정의 됨)을 인식하지 못하므로 출력이 오류의 결과로 표시됩니다. 그러나, 나는과 같이 실행 할 수 있었다 :

$third = '2011-04-27 16:20:12 GMT'; 

$dt = new DateTime($third); 
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName())); 
echo $dt->getTimezone()->getName().'<br />'; 

난 당신이 방금 GMT으로 +00를 대체 할 수 있다고 생각합니다.

+0

나는 +00을 UTC 나 GMT로 대체 할 코드 조각을 쓸 수도 있고, 시간대 이름을 반환하도록 데이터베이스를 설정할 수도 있지만 그건 내 포인트가 아니야. 내 요점은 "왜 getName() 메서드가 오프셋을 반환하는지"입니다. "? –

+0

Wh1T3h4Ck5가 말하는 것은 정확합니다. 왜냐하면'getName' 함수가 PHP에서 정의 된 시간대로 오프셋을 해결할 수 없기 때문입니다. –

관련 문제