ISO周的PHP数组日期

时间:2013-09-21 12:58:58

标签: php arrays datetime

我需要从特定的ISO周中获得Mon-Fri的日期数组。我似乎无法找到返回数组的内置方法。我使用DateTime类和setISODate方法,如下所示:

$bookingDate = new DateTime();
$bookingWeek = $bookingDate->setISODate($bookingDate->format("Y"), $bookingDate->format("W"));
$bookingDates = array();
$mon = $bookingDate->setISODate($bookingDate->format("Y"), $bookingDate->format("W"), 1);
array_push($bookingDates, $mon);
$tue = $bookingDate->setISODate($bookingDate->format("Y"), $bookingDate->format("W"), 2);
array_push($bookingDates, $tue);
$wed = $bookingDate->setISODate($bookingDate->format("Y"), $bookingDate->format("W"), 3);
array_push($bookingDates, $wed);
$thu = $bookingDate->setISODate($bookingDate->format("Y"), $bookingDate->format("W"), 4);
array_push($bookingDates, $thu);
$fri = $bookingDate->setISODate($bookingDate->format("Y"), $bookingDate->format("W"), 5);
array_push($bookingDates, $fri);
print_r($bookingDates);

但是 - 日期数组的print_r每天都会返回星期五!有没有办法达到我想要的目的?

1 个答案:

答案 0 :(得分:1)

您正在更改相同的DateTime实例$bookingDate)并将其添加到数组中。最后,数组的每个元素都指向同一个DateTime实例。它包含您最后设置的日期。那是$fri

您需要不同的实例(根据您的需要)或数组中的格式化字符串。

要在每个$bookingDate = new DateTime();函数调用之前创建不同的实例,请添加$bookingDate->setISODate。这将消耗很多或资源。

最好使用单个DateTime实例并迭代它。

for($i=0;$i<7;$i++){
    $year = intval($bookingDate->format("Y"));
    $week = intval($bookingDate->format("W"));
    $bookingDate->setISODate($year, $week, $i+1);
    $bookingDates[]=$bookingDate->format(DateTime::ISO8601);
}
print_r($bookingDates);

输出

Array
(
    [0] => 2013-09-16T20:23:42+0600
    [1] => 2013-09-17T20:23:42+0600
    [2] => 2013-09-18T20:23:42+0600
    [3] => 2013-09-19T20:23:42+0600
    [4] => 2013-09-20T20:23:42+0600
    [5] => 2013-09-21T20:23:42+0600
    [6] => 2013-09-22T20:23:42+0600
)