4

時刻が現在、事前定義された「ホットゾーン」の数にあるかどうかに基づいてブール値を返すPHP関数があります。タイムゾーンはアメリカ/シカゴ(UTC-0600)です。次の作品:

$d = 60*60;                    /* duration of hotzone */
$o = -(3*24+18)*3600;          /* offset to bring UNIX epoch to 12a Sun local*/
$curTime = (time()-$o)%604800; /* time since 12a Sun */

/* Hotzones */
$hotTime = array();
$hotTime[0 ] = (0*24+11)*3600; /* 11a Sun */
$hotTime[1 ] = (0*24+18)*3600; /*  6p Sun */
$hotTime[2 ] = (2*24+19)*3600; /*  7p Tue */
$hotTime[3 ] = (3*24+ 6)*3600; /*  6a Wed */
$hotTime[4 ] = (3*24+11)*3600; /* 11a Wed */

$hotTimes = count($hotTime);

for ($i = $hotTimes-1; $i>=0; $i--) {
  if (($curTime > $hotTime[$i])&&($curTime < $hotTime[$i]+$d)) {
    return true;
  }
}

return false;

ただし、夏時間調整を年に2回手動で更新する必要があります。これを行うには、計算したハックの「オフセット」よりも自然でエレガントな方法があると考えなければなりません。DSTを考慮に入れて、これを行うためのより良い方法に出くわした人はいますか?

4

1 に答える 1

2

DateTimeこのためにクラスを使用できます:

$hottimes = array (
    array(
        'start'=> new DateTime('Sun 11:00:00 America/Chicago'),
        'stop'=> new DateTime('Sun 12:00:00 America/Chicago')
    ),
    array(
        'start'=> new DateTime('Sun 18:00:00 America/Chicago'),
        'stop'=> new DateTime('Sun 19:00:00 America/Chicago')
    ),
    array(
        'start'=> new DateTime('Tue 19:00:00 America/Chicago'),
        'stop'=> new DateTime('Tue 20:00:00 America/Chicago')
    ),
    array(
        'start'=> new DateTime('Wed 06:00:00 America/Chicago'),
        'stop'=> new DateTime('Wed 07:00:00 America/Chicago')
    ),
    array(
        'start'=> new DateTime('Wed 11:00:00 America/Chicago'),
        'stop'=> new DateTime('Wed 12:00:00 America/Chicago')
    )
);

$now = new DateTime();

foreach($hottimes as $hotime) {
    if($now >= $hotime['start'] && $now < $hotime['stop']) {
        return true;
    }
}

そのようなことにはUNIXタイムスタンプを使用しないでください。そのためには、DateTimeを使用することをお勧めします。Svenのコメントも読んでください。(ありがとう)

于 2013-02-04T21:51:44.347 に答える