使用DatePeriod,DateInterval类参数化PHP代码

时间:2010-08-05 15:23:45

标签: php datetime time timezone

我不太了解DatePeriod,DateInterval类。此问题与另一个问题相关联 - How to display converted time zones in a 'generic week' (Sunday thru Saturday)?其中我想参数化artefacto提供的解决方案。

帮助将不胜感激!

这是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 :(得分:0)

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