2014-04-12 2 views
0

오프셋을 시간대 이름으로 변환하는 데 이상한 문제가 있습니다.
오프셋을 시간대로 변환하는 데 다음 코드를 사용합니다.timezone_name_from_abbr이 잘못된 결과를 가져 오는 이유는 무엇입니까?

$timezoneOffset = "+05:30"; 
echo $timezone_name = timezone_name_from_abbr("",$timezoneOffset*3600,0); 

출력 : 아시아/카라치

예상 출력 : 내가

$timezone = 'Asia/Kolkata'; 
$time = new \DateTime('now', new DateTimeZone($timezone)); 
$timezoneOffset = $time->format('P'); //output: +05:30 

$timezone_name = timezone_name_from_abbr("",$timezoneOffset*3600,0); 
echo $timezone_name;exit; 

여전히 출력이 Asia/Karachi

이다 사용 아시아/콜카타

오프셋 확인하려면

그래서 문제가 무엇입니까? 이 문제를 해결하려면 어떻게해야합니까?

미리 감사드립니다.

+0

이 의미를 이해했는지 확인하십시오. 같은 오프셋을 공유하는 다른 시간대가 많이 있으며, 일부는 동일한 약어를 공유합니다. 'timezone_name_from_abbr'은 가능한 모든 결과의 * 첫 번째 일치 *를 반환합니다. [timezone tag wiki] (http://stackoverflow.com/tags/timezone/info)의 "Time Zone! = Offset"도 참조하십시오. –

답변

2

$gmtOffset 매개 변수 (GMT로부터의 오프셋)는 올바르지 않습니다.

PHP의 경우 "+05:30" * 3600은 결과로 18000이됩니다. 이는 문자열이 정수 5으로 변환 된 다음 곱해지기 때문입니다. 물론 이는 을 300 분의 오프셋으로 예상 전화 번호 330 분이 아니라 오히려 "잘못된"시간대 이름이 반환되도록합니다.

기존 $timezoneOffset 문자열을 유지하려면 다음을 사용하여 시간대 오프셋 (초)으로 변환 할 수 있습니다.

$timezoneOffset = "+05:30"; 
$offsetSeconds = DateTime::createFromFormat('P', $timezoneOffset)->format('Z'); 
+0

나는 '5.5'로 오프셋을 변경하고 해결됩니다. 고맙습니다. – DS9

관련 문제