33

現地時間の午前 9 時に、世界中のユーザーにメールを送信する必要があります。サーバーは英国にあります。私にできることは、各ユーザーとサーバーの時間との時差を設定することです。これは、DST が存在しなければ完全に機能します。

これを説明する例を次に示します。

  • ジョンはニューヨークで働いており、サーバー (英国) 時間から -5 時間です。
  • リチャードはイギリスのロンドンで働いているので、サーバーとの時間差は 0 です。

サーバーが特定の日曜日の午前 2:00 に GMT から GMT +1 (BST) に移行した場合、これは John の現在の時差が -6 時間であることを意味します。

このシナリオは、サーバーの現地時間外のすべてのユーザーを更新することで処理できますが、他のすべてのユーザーの時間を前後に移動した後でも、ユーザーがいつ(時間と日付) 生きているかを検出する方法が必要です。英国外では、現地時間をおそらく DST のものに変更します (または変更しません)。

世界の他の地域が DST に入る/終了する時期を知る/検出する PHP メソッドが必要です。

4

3 に答える 3

27

DST 移行のすべての詳細を自分で知る必要がありますか? それとも、特定のタイムゾーンの午前 9 時がいつなのかを知りたいだけですか?

後者の場合、PHP はオペレーティング システムのタイムゾーン データベースを使用してそれを行うことができます。strtotime()関数は、あなたが何を意味するかを「理解する」のに非常に優れています。

echo strtotime("today 9:00 am America/New_York");  // prints "1306501200"
echo strtotime("today 9:00 am Europe/London");     // prints "1306483200"

PHP でサポートされているタイムゾーンのいずれかを使用していることを確認してください。

于 2011-05-27T18:40:22.833 に答える
26

ジミーが指摘しているように、タイムゾーン遷移を使用できますが、これは PHP <5.3 では使用できません。dateTimeZone() は PHP>=5.2.2 ですが、引数付きの getTransitions() はそうではありません! その場合、DST であるかどうかを含め、タイムゾーン データを提供できる関数を次に示します。

function timezonez($timezone = 'Europe/London'){
    $tz = new DateTimeZone($timezone);
    $transitions = $tz->getTransitions();
    if (is_array($transitions)){
        foreach ($transitions as $k => $t){
            // look for current year
            if (substr($t['time'],0,4) == date('Y')){
                $trans = $t;
                break;
            }
        }
    }
    return (isset($trans)) ? $trans : false;
}

そうは言っても、タイムゾーンが DST であるかどうかを知る必要がある場合は、date() を使用するより簡単な方法があります。たとえば、英国が DST に入っているかどうかを知りたい場合は、次のようにします。

date_default_timezone_set('Europe/London');
$bool = date('I'); // this will be 1 in DST or else 0

... または、現在のサーバー時間以外の日時を指定する場合は、date() の 2 番目の引数としてタイムスタンプを指定します。

于 2012-06-14T12:02:17.687 に答える
16

私の答えを少し変更します: DateTimeZone::getTransitionsは、PHP >= 5.2 を使用していれば、必要なことを行うように見えます。

ドキュメントのコメントから:

<?php 
$theTime = time(); // specific date/time we're checking, in epoch seconds. 

$tz = new DateTimeZone('America/Los_Angeles'); 
$transition = $tz->getTransitions($theTime, $theTime); 

// only one array should be returned into $transition. Now get the data: 
$offset = $transition[0]['offset']; 
$abbr = $transition[0]['abbr']; 
?>

ここでは、チェックしたいタイムゾーンを渡すだけで、そのタイムゾーンが DST であるかどうか、またはオフセットが何であるかを知ることができます。次に、GMT に対するオフセットをチェックして、今すぐ電子メールを送信するかどうかを確認する必要があります。

于 2011-05-27T16:40:15.947 に答える