0

以下の方法を使用して、時間のスケジュールの次の時間がいつになるかを計算しています。

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')、ユニットテストできるように、予測可能な方法で「次の水曜日」を把握するために、「今」が何時であるかを伝える必要があります。

4

1 に答える 1

1

__construct 関数にはオプションの paramがあります。

public __construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )

例:

<?php
try {
    $date = new DateTime('2000-01-01');
} catch (Exception $e) {
    echo $e->getMessage();
    exit(1);
}

echo $date->format('Y-m-d');
?>

編集: strtotimeを使用してタイムスタンプを生成し、dateを使用して新しいオブジェクトに渡す文字列を生成できます。

$date = new DateTime(date("Y-m-d", strtotime("next wednesday")));
于 2012-08-24T10:31:23.140 に答える