現地時間の午前9時に世界中のユーザーにメールを送信する必要があります。サーバーは英国にあります。私ができることは、各ユーザーとサーバーの時間との間に時差を設定することです。これは、DSTが存在しなければ完全に機能します。
以下に例を示します。
サーバーが特定の日曜日の午前2時にGMTからGMT +1(BST)に移行する場合、これはジョンが現在-6Hの時差を持っていることを意味します。
このシナリオでは、サーバーのローカル時間外にすべてのユーザーを更新することで引き続き処理できますが、他のすべてのユーザーの時間を前後に移動したら、when(日時)英国外に住んでいるユーザーは、現地時間をDSTの可能性の高い時間に変更します(または変更しません)。
世界の他の地域がDSTに出入りする時期を知る/検出するためにPHPメソッドが必要です。
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がサポートするタイムゾーン のいずれかを使用していることを確認してください。
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番目の引数としてタイムスタンプを指定します。
私の答えを少し変更します: 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に対するオフセットをチェックして、今すぐ電子メールを送信するかどうかを確認する必要があります。