我正在尝试获取一组日期时间对象但却失败了。
我想今天约会,并在过去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
时,我得到一个空数组。
我做错了什么?
答案 0 :(得分:3)
更改
$begin = $today->sub(new DateInterval('P30D'));
到
$begin = new DateTime();
$begin->sub(new DateInterval('P30D'));
答案 1 :(得分:1)
您覆盖$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');
}
将起作用
答案 2 :(得分:1)
“sub”方法修改源对象,并输出对象本身作为返回值(实际上这是用于方法链接)。它不仅仅使用新日期创建新对象。
$begin = $today->sub(new DateInterval('P30D'));
修改$today
并输出您随后声明为$begin
的副本。这导致两个对象具有相同的日期,因此没有时间间隔可以迭代。
请参阅http://php.net/manual/en/datetime.sub.php
您需要为结束日期创建单独的对象:
$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);
工作