Php 获取最近30天的所有日期(datetime对象)

Php 获取最近30天的所有日期(datetime对象),php,datetime,Php,Datetime,我试图获得一个datetime对象数组,但失败得很惨 我想记录今天的日期,并获取过去30天内的所有日期 $today = new DateTime(); $begin = $today->sub(new DateInterval('P30D')); $interval = new DateInterval('P1D'); // 1 Day $dateRange = new DatePeriod($begin, $interval, $today); $range = []; forea

我试图获得一个datetime对象数组,但失败得很惨

我想记录今天的日期,并获取过去30天内的所有日期

$today = new DateTime();
$begin = $today->sub(new DateInterval('P30D'));

$interval = new DateInterval('P1D'); // 1 Day
$dateRange = new DatePeriod($begin, $interval, $today);

$range = [];
foreach ($dateRange as $date) {
    $range[] = $date->format('Y-m-d');
}
当我转储
$range
时,我得到一个空数组

我做错了什么?

改变

$begin = $today->sub(new DateInterval('P30D'));

改变

$begin = $today->sub(new DateInterval('P30D'));


您覆盖了
$today
,因此
$today
$begin
完全相同

$today =  new DateTime();
$copy = clone $today;
$begin = $copy->sub(new DateInterval('P30D'));

$interval = new DateInterval('P1D'); // 1 Day
$dateRange = new DatePeriod($begin, $interval, $today);

$range = [];
foreach ($dateRange as $date) {
    $range[] = $date->format('Y-m-d');
}

将起作用

您覆盖
$today
,因此
$today
$begin
完全相同

$today =  new DateTime();
$copy = clone $today;
$begin = $copy->sub(new DateInterval('P30D'));

$interval = new DateInterval('P1D'); // 1 Day
$dateRange = new DatePeriod($begin, $interval, $today);

$range = [];
foreach ($dateRange as $date) {
    $range[] = $date->format('Y-m-d');
}
“sub”方法修改源对象,并将对象本身作为返回值输出(实际上这是用于方法链接)。它不仅仅是用新的日期创建一个新对象

$begin = $today->sub(new DateInterval('P30D'));
修改
$today
并输出一个副本,然后将其声明为
$begin
。这会导致两个对象具有相同的日期,因此没有迭代的时间间隔

您需要为结束日期创建一个单独的对象:

$begin = new DateTime();
$begin->sub(new DateInterval('P30D'));
$end = new DateTime();

$interval = new DateInterval('P1D'); // 1 Day
$dateRange = new DatePeriod($begin, $interval, $end);

$range = [];
foreach ($dateRange as $date) {
    $range[] = $date->format('Y-m-d');
}
var_dump($range);
查看它在

中的工作“sub”方法修改源对象,并将对象本身作为返回值输出(实际上这是用于方法链接)。它不仅仅是用新的日期创建一个新对象

$begin = $today->sub(new DateInterval('P30D'));
修改
$today
并输出一个副本,然后将其声明为
$begin
。这会导致两个对象具有相同的日期,因此没有迭代的时间间隔

您需要为结束日期创建一个单独的对象:

$begin = new DateTime();
$begin->sub(new DateInterval('P30D'));
$end = new DateTime();

$interval = new DateInterval('P1D'); // 1 Day
$dateRange = new DatePeriod($begin, $interval, $end);

$range = [];
foreach ($dateRange as $date) {
    $range[] = $date->format('Y-m-d');
}
var_dump($range);

查看它在

处的工作情况,或者您可以
克隆
它。是的,我发现这不管用。。谢天谢地,我甚至不知道php中存在这样的克隆。或者,你可以
clone
it。是的,我发现这不管用。。谢天谢地,我甚至不知道phpp中存在这样的克隆。请将这个好答案传输到这个加载了不太好答案的更早的副本。请将这个好答案转移到这个更早的副本中,该副本中包含了不太好的答案。相关的:相关的: