Параметризация php-кода с помощью классов DatePeriod, DateInterval - PullRequest
2 голосов
/ 05 августа 2010

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

Помощь будет оценена!

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

$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)
    );
    ...

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

1 Ответ

0 голосов
/ 06 августа 2010

Класс 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
);
//...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...