Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用DatePeriod、DateInterval类参数化php代码_Php_Datetime_Time_Timezone - Fatal编程技术网

使用DatePeriod、DateInterval类参数化php代码

使用DatePeriod、DateInterval类参数化php代码,php,datetime,time,timezone,Php,Datetime,Time,Timezone,我不太理解DatePeriod和DateInterval类。这个问题与另一个问题相关联——我想将由提供的解决方案参数化 谢谢你的帮助 这是Artefactor的代码: $tz1 = new DateTimezone("Asia/Calcutta"); $indiaAvail = array( new DatePeriod(new DateTime("2010-08-01 10:00:00", $tz1), new DateInterval("PT2H15M"), 1) )

我不太理解DatePeriod和DateInterval类。这个问题与另一个问题相关联——我想将由提供的解决方案参数化

谢谢你的帮助

这是Artefactor的代码:

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

正如Artefactor所指出的,“从两次构建DatePeriod并不是为了让它在两次之后立即分解为这两个日期”,但是我不明白如何轻松地修改它,使其与他的代码的其余部分一起工作(我想这需要$indiaAvail的存在…)类存储开始日期、结束日期和间隔(或者,相当于开始日期、间隔和重复次数)。它是
可遍历的
,当在
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
);
//...

DatePeriod
类存储开始日期、结束日期和间隔(或者等效地存储开始日期、间隔和重复次数)。它是
可遍历的
,当在
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
);
//...

非常好用-抱歉打扰你了!非常好用-抱歉打扰你了!