2010-11-28 2 views
4

사용자의 로컬 시간을 계산하는 아래의 방법이 때때로 작동하지 않는다고 들었습니다. PHP에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 너 뭐하니?PHP에서 시간대 차이 계산을 어떻게 처리합니까?

public function getTimeOffset ($time) { 
    $this->_cacheTimeOffset(); 
    if ($this->timeOffsetExecuted) { 
     $d = date("O"); 
     $neg = 1; 

     if (substr($d, 0, 1) == "-") { 
      $neg = -1; 
      $d = substr($d, 1); 
     } 

     $h = substr($d, 0, 2)*3600; 
     $m = substr($d, 2)*60; 

     return $time + ($neg * ($h + $m) * -1) + (($this->timeOffset + $this->getDstInUse()) * 3600); 
    } 
    return $time; 
} 

답변

2

, 여러 시간대 업데이트를 수행해야 할 수도 있습니다, 같은 DateTime::getOffset로,
전환의 역사를

+0

현재 사용자가 프로필에 시간대를 지정할 수 있도록 허용하고 있습니다. PHP를 통해 동적으로 가져올 수 있고 시간대를 물어볼 필요가 없다는 말입니까? – Webnet

+1

@Webnet - 사용자에게 자신의 현재 시간대를 자신의 프로필에 배치해야합니다. 아마도 시간대 목록을 제공하고 사용자가 선택할 수있게 할 수 있습니다. 지원되는 시간대의 전체 목록을 제공 할 수있는'DateTimeZone :: listIdentifiers' - http : //www.php.net/manual/en/datetimezone.listidentifiers.php – ajreal

-1

빠른 솔루션을 공개 DateTimeZone::getTransitions이 방법을
또는 DateTimeZone::getOffset

일부 국가를 날짜 시간 연장을 사용하여

<?php echo date('g:i a', strtotime("now + 10 hours 30 minutes")); ?> 
+0

이것은 시간 형식 지정에 불과하며 시간과 관련이 없습니다 전혀 구역. – Webnet

0

그냥 비슷한 질문 인 over here에 대답했습니다. 그 중 하나를 확인하는 것이 좋습니다; 나는 시간대 오프셋 계산을하는 두 가지 기본 방법을 설명했다. (간단한 수학을 사용하고 datetimezonedatetime 클래스를 사용한다.) 꽤 꼼꼼하게 설명했다.

첫 번째 방법은 가장 쉬운 (가장 논리적 인) 방법이 될 것이고, 그 저장소에 그들의 오프셋 (이미 이있는 경우, 즉)하고 번성 그 3600 (1 시간으로 초), 값을 현재 유닉스 시간 소인에 추가하면 최종 시간은 입니다.

또 다른 방법은 DateTimeDateTimeZone 클래스를 사용하는 것입니다. here과 같이 두 클래스의 작동 방식은 두 개의 DateTimeZone 개체 (하나는 시간대, 다른 하나는 해당 시간대)를 만드는 것입니다. 제 파라미터 (각각) 위에 DateTimeZone 객체에 대한 참조 인 상기 "now" 번째 인으로 두 DateTime 객체를 생성; 다음 당신의 시간대 궁극적으로 , 첫 번째 매개 변수로 자신의 시간대 객체 를 전달하는 당신에게 이 시간을 얻기 위해 현재 유닉스 타임 스탬프에 추가 할 수있는 초 오프셋 (offset)를 받고 개체의 getOffset 메소드를 호출하는 작업을 실행해야합니다.

1
date('Z'); 

초 UTC 오프셋을 반환합니다.

관련 문제