2012-03-02 2 views
1

우리는 사람들이 다른 플레이어에게 도전하기 위해 시합 시간을 선택할 수있는 전투 시스템을 가지고 있습니다. 일치 항목을 만들려면 사용자가 날짜를 선택해야합니다. 현재 사용자는 드롭 다운 목록에서 요일, 시간, 분 및시/분을 선택합니다. 사용자가 5/20/2012 @ 1PM을 선택하면 시스템은 하루의 시작부터 시간과 분을 추가합니다.PHP 날짜 및 타임 스탬프가있는 조언

$time = strtotime('today', $inputdate); 
$time = $time + $hours + $minutes; 

사용자의 경우 $hours 값이 변경이 오전 또는 오후 선택 : 여기에 내가 무슨 말을 더 잘 이해를 얻을 수있는 빠른 샘플입니다. 그것은 꽤 기본입니다 : sample

사람들이 시작한 시간대 문제가있을 때까지 모든 것이 잘 작동했습니다. 예를 들어, 플레이어 A가 오후 1시에 성냥을 만들면 플레이어 B는 오후 1시에 경기가 시작되는 것을 보게되지만 다른 시간대를 갖게됩니다!/

나는 시간대의 문제를 해결하는 방법을 알고하지 않습니다

문제

내가 문제를 알 수 없다는 것입니다. 나는 모든 것이 함께 무너지기를 기대하면서 기능을 창조해 왔지만 행운은 없다.

내가 무엇을 가지고 :

  • 사용자 프로필이 시간대 옵션이 있습니다.
  • 원시 시간 소인을 가져 와서 사용자의 시간대를 기준으로 형식화 된 시간을 반환하는 함수입니다.
  • 타임 스탬프를 가져와 사용자의 시간대에 따라 다른 타임 스탬프 으로 변환하는 함수입니다.

나는 잃어 버렸고 문제를 해결할 수없는 것처럼 보였습니다.하지만 지금은 논리적이라고 생각하지 않습니다. 나는 이것을 쓰기 위해 1 시간이 걸렸고 어떻게 할 수 있는지 설명하려고 노력했다. 왜냐하면 나 자신이 그것을 작동하게하는 방법을 모른다. 몇 가지 조언을 부탁드립니다.

나는 UTC-5에 타임 스탬프를 변환하는 기능이 필요합니다 데이터베이스에

function input_date($timestamp) 
{ 
    global $vbulletin; 
    $timestamp = (int)$timestamp; 

    if (strlen((string)$timestamp) == 10) 
    { 
     $hour = 3600.00; 
     $offset = $vbulletin->userinfo['timezoneoffset'];//sample -8 
     $ds = (int)$vbulletin->userinfo['dstonoff'];//DST 
     $fluff = $hour*($offset+5.00); 
     $timestamp = $timestamp+$fluff+($ds*$hour); 

     return $timestamp;//return timestamp in UTC-5 format.. 
    } 
    else 
    { 
     return 0; 
    } 
} 
+3

일관된 시간대에 모든 데이터를 저장하십시오 (UTC는 이동해야합니다). 그런 다음 사용자의 시간대를 표시 할 때만 사용자의 시간대를 계산하십시오. – cmbuckley

+0

다른 표준 시간대로 저장하면 차이가 있습니까? – user962449

+0

아니지만 천천히 미쳐 갈 수 있습니다 .--) UNIX 타임 스탬프 (strtotime의 결과)를 저장하면 시간대 정보없이 저장합니다. – cmbuckley

답변

0

기본적으로 모든 것이 하나의 시간대, DST의 영향을받지 않는 것이 바람직 하나를 사용하여 저장해야합니다. 표준 옵션은 UTC입니다. 당신의 이름으로 사용자의 시간대를 알고있는 경우

, 당신은 당신의 시간을 생성하는 것을 사용할 수 있습니다 당신은 자신의 약어로 저장되어있는 시간대가있는 경우

// Player A creates match at 1PM Europe/London 
$timezone = 'Europe/London'; 
$localTime = '2012-03-01 13:00:00'; 

// work out UNIX timestamp using that timezone (making it timezone independent) 
date_default_timezone_set($timezone); 
$timestamp = strtotime($localTime); 

// store $timestamp in the database 

// Player B views the timestamp with timezone America/Los_Angeles 
$timezone = 'America/Los_Angeles'; 

date_default_timezone_set($timezone); 
var_dump(date('c', $timestamp)); // see manual for more output formats 

(예 : "CET을", "GMT") timezone_name_from_abbr을 사용하여 올바른 시간대 이름을 가져옵니다.

+0

이 코드를 가져올 수 없습니다. 사용자 오프셋 (offset)만으로 사용자의 시간대를 알 수 있습니다. 사용자가 LA에 있으면 offset/timezone은 -8입니다 (시스템 설정 방법). – user962449

+0

다루기가 너무 어렵지 않아야하지만, 항상 완벽하지는 않습니다 (즉, UTC-8은 LA에 있거나 일광 절약 시간에 알래스카에 있기 때문에 UTC-8입니까?) [이 질문을보십시오] http : // stackoverflow.com/questions/2286281/converting-timezone-offset-to-friendly-name-in-php)을 사용하면 UTC 오프셋에서 시간대 이름을 얻는 가장 좋은 방법을 알 수 있습니다. – cmbuckley

+0

시스템에는 사용자의 DST도 있으므로 문제는 아닙니다. 이제 문제를 알았습니다. 문제는 타임 스탬프를 UTC -5 (서버 시간)로 변환해야한다는 것입니다. 나는 그 일을하는 법을 모르겠다. 나는 내 Q를 업데이트하여 조금만 도와 줄 수 있기를 바란다. – user962449

관련 문제