Параметризация php-кода с помощью классов DatePeriod, DateInterval

Я не очень хорошо понимаю классы DatePeriod, DateInterval. Этот вопрос связан с другим - Как отобразить преобразованные часовые пояса в «общей неделе» (с воскресенья по субботу)? где я хочу параметризовать решение, предлагаемое артефакт.

Помощь приветствуется!

Это код артефакта:

$tz1 = new DateTimezone("Asia/Calcutta");
$indiaAvail = array(
    new DatePeriod(new DateTime("2010-08-01 10:00:00", $tz1),
        new DateInterval("PT2H15M"), 1)
);

Вот что я придумал:

function shift_timezones_onweek($from_timezone, $from_timebegin, $from_timeend, $to_timezone)
{

    $tz1 = new DateTimezone($from_timezone);

    $datetime1 = new DateTime("2010-08-01 $from_timebegin", $tz1);
    $datetime2 = new DateTime("2010-08-01 $from_timeend", $tz1);

    $interval = $datetime1->diff($datetime2);

    $indiaAvail = array(
        new DatePeriod($datetime1, $interval, 1)
    );
    ...

Как указывает артефакт, «нет смысла создавать DatePeriod из двух раз только для того, чтобы сразу после этого разложить его на эти две даты», однако я не понимаю, как я могу легко изменить это, чтобы заставить его работать с остальной частью его кода ( который требует, чтобы $indiaAvail существовал, как я думаю...)


person DrMHC    schedule 05.08.2010    source источник


Ответы (1)


Класс DatePeriod хранит дату начала, дату окончания и интервал (или, что то же самое, дату начала, интервал и количество повторений). Это Traversable, и при повторении в цикле foreach он выдаст все даты (объекты DateTime) от начала до конца с заданным интервалом, разделяющим их.

Следовательно, итерация класса DatePeriod аналогична итерации массива, состоящего из всех дат, которые были бы получены DatePeriod.

Итак, мы можем написать:

//...
$tz1 = new DateTimezone($from_timezone);

$datetime1 = new DateTime("2010-08-01 $from_timebegin", $tz1);
$datetime2 = new DateTime("2010-08-01 $from_timeend", $tz1);

$indiaAvail = array(
    array($datetime1, $datetime2),
);


$tz2 = new DateTimezone($to_timezone);
//convert periods:
$times = array_map(
    function (array $p) use ($tz2) {
       $res = array();
       foreach ($p as $d) {
           $res[] = $d->setTimezone($tz2);
       }
       return $res;
    },
    $indiaAvail
);
//...
person Artefacto    schedule 06.08.2010
comment
Работает чудесно - извините, что беспокою вас этим! - person DrMHC; 06.08.2010