1

我需要一组特定 ISO 周的周一至周五日期。我似乎找不到返回数组的内置方法。我正在使用带有 setISODate 方法的 DateTime 类,如下所示:

$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 每天都返回星期五!有没有办法实现我想要的?

4

1 回答 1

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
)
于 2013-09-21T14:15:56.783 回答