以下の方法を使用して、時間のスケジュールの次の時間がいつになるかを計算しています。
public static function getNextUtcTimestampFromSchedule($schedule, $timezone)
{
$timestamps = array();
foreach ($schedule as $day => $times){
$dt = new \DateTime('next '.self::getDayString($day), new \DateTimeZone($timezone));
foreach ($times as $time){
list($hour, $min) = explode(':', $time);
$dt->setTime($hour, $min);
$timestamps[] = $dt->getTimestamp();
}
}
sort($timestamps);
return $timestamps[0];
}
$schedule
次のような配列です。
$schedule = array(
0 => array('11:00', '17:00'),
1 => array('10:00', '18:00'),
2 => array('09:00', '18:00'),
3 => array('11:00', '17:00'),
4 => array('11:00', '16:00'),
5 => array('15:00', '16:00'),
6 => array('11:00', '12:00'),
);
getDayString
たとえば、0 を 'sunday' に単純に変換します。
単体テストを作成するにnow()
は、時刻を偽装するか、メソッドに渡して使用する必要があります。
問題は、それを DateTime でどのように使用できるかということです。
つまりDateTime('next wednesday')
、ユニットテストできるように、予測可能な方法で「次の水曜日」を把握するために、「今」が何時であるかを伝える必要があります。