web-dev-qa-db-ja.com

PHP夏時間の検出

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

以下に例を示します。

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

サーバーが特定の日曜日の午前2時にGMTからGMT +1(BST)に移行する場合、これはジョンが現在-6Hの時差を持っていることを意味します。

このシナリオでは、サーバーのローカル時間外にすべてのユーザーを更新することで引き続き処理できますが、他のすべてのユーザーの時間を前後に移動したら、when(日時)英国外に住んでいるユーザーは、現地時間をDSTの可能性の高い時間に変更します(または変更しません)。

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

28
Nicolas

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がサポートするタイムゾーン のいずれかを使用していることを確認してください。

26
squirrel

Jimmyが指摘しているように、タイムゾーン遷移を使用できますが、これは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番目の引数としてタイムスタンプを指定します。

21
Owen

私の答えを少し変更します: 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に対するオフセットをチェックして、今すぐ電子メールを送信するかどうかを確認する必要があります。

13
Jimmy Sawczuk