2012-03-02 14 views
1

私たちは、他のプレイヤーに挑戦するための試合時間を選ぶことができるバトルシステムを持っています。一致を作成するには、ユーザーが日付を選択する必要があります。現在、ユーザーはドロップダウンリストから日、時、分、午後/午後を選択します。ユーザーが5/20/2012 @ 1PMを選択すると、システムは1日の開始から時間と分を追加します。ユーザーは、AMまたはPMを選択した場合PHPの日付とタイムスタンプ付きのアドバイス

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

$hours変化の値を:ここで私が話しているかのより良い理解を得るために迅速なサンプルです。かなり基本的です。 sample

開始された人がタイムゾーンの問題を抱えるまで、すべてうまくいきました。たとえば、プレーヤーAが1:PMで試合を作成した場合、プレーヤーBは試合が1:PMで開始するのを見ますが、彼/彼女は異なるタイムゾーンを持つでしょう!

問題は、私はこの問題を知っていないということです:/

私はタイムゾーンの問題を修正する方法がわかりません。私はすべてが一緒に落ちることを期待して機能を作り出していますが、運はありません。

  • ユーザープロファイルは、タイムゾーンのオプションがあります。私が持っているもの

  • 生のタイムスタンプを取得し、ユーザーのタイムゾーンに基づいてフォーマットされた時刻を返す関数です。
  • タイムスタンプを取得し、ユーザーのタイムゾーンに基づいて別のタイムスタンプ に変換する関数。

私は紛失しています。問題を解決できないようですが、コードすることはできますが、今は論理的ではないと思います。私はこれを書くために1時間かかりましたし、私は自分がそれを働かせる方法を自分で分からないので、それを説明することを試みます。アドバイスありがとうございます。

Iは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

私はこのコードを取得しません。ユーザーがLAにいる場合、オフセット/タイムゾーンは-8(システムの設定方法)のように、オフセットだけでユーザーのタイムゾーンを知っています。 – user962449

+0

あまりにも扱いにくいはずはありませんが、それはいつも完璧ではありません(すなわち、彼らがLAにいるか、アラスカで夏時間にいるのでUTC -8ですか?)[[この質問]を見てくださいhttp:// stackoverflow。com/questions/2286281/converting-timezone-offset-to-friendly-name-in-php)を使用して、UTCオフセットからタイムゾーン名を取得する最良の方法を知ることができます。 – cmbuckley

+0

システムにはユーザーのDSTもありますので問題はありません。私は今問題を知っている、問題はタイムスタンプをUTC -5(サーバ時間)に変換する必要があるということです。私はそれをする方法がわからない...私は私のQを更新してうまくいけば、少し助けることができます。 – user962449

関連する問題