我有以下脚本。我创建一个起始日期时间对象和结束日期时间对象。然后我创建一个具有1个月日期间隔的dateperiod对象。 我只是遍历所有日期。
我的问题是,正如您可以看到下面的输出,迭代失踪2015-04-01 00:00:00.000000
。
我的脚本有问题还是个bug?
PS:更改DateTimeZone不会改变输出。
$start = \DateTime::createFromFormat('d.m.Y', '31.03.2015')->setTime(0, 0);
$end = \DateTime::createFromFormat('d.m.Y', '10.02.2016')->setTime(0, 0);
$datePeriod = new \DatePeriod($start, new \DateInterval('P1M'), $end);
var_dump($start, $end);
foreach ($datePeriod as $date) {
var_dump($date);
}
var_dump的输出($ start,$ end);
object(DateTime)[1524]
public 'date' => string '2015-03-31 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1477]
public 'date' => string '2016-02-10 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
输出foreach()var_dump($ date);
object(DateTime)[1581]
public 'date' => string '2015-03-31 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1438]
public 'date' => string '2015-05-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1581]
public 'date' => string '2015-06-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1438]
public 'date' => string '2015-07-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1581]
public 'date' => string '2015-08-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1438]
public 'date' => string '2015-09-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1581]
public 'date' => string '2015-10-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1438]
public 'date' => string '2015-11-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1581]
public 'date' => string '2015-12-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1438]
public 'date' => string '2016-01-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
object(DateTime)[1581]
public 'date' => string '2016-02-01 00:00:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
答案 0 :(得分:1)
为了澄清您希望在两个日期范围之间每天循环一次?如果是这样,你可以用不同的方式解决问题。
$startDate = \DateTime::createFromFormat('d.m.Y', '31.03.2015');
$endDate = \DateTime::createFromFormat('d.m.Y', '10.02.2016');
while ($startDate <= $endDate) {
// Logic here.
$startDate->modify('+1 day');
}
上面的内容会在两个日期之间的所有日子里以一天的增量循环,如果您的要求符合我的要求,这应该足够了吗?
此外,您可以将DateTime
对象初始化为您需要的任何开始/结束日期,然后如上所示循环,您可以增加所需的任何值+1 day
,+1 week
和等等。
处理DateTime
如果你想在一个月的第一天,也就是一个月的最后一天,那么就可以更容易地使用以下内容:
$date = new DateTime();
$startDate = DateTime::createFromFormat('Y-m-d H:i:s', $date->format('Y-m-01 00:00:00');
$endDate = DateTime::createFromFormat('Y-m-d H:i:s', $date->format('Y-m-t 00:00:00');
t
为您提供一个月的最后一天,
01
可以让您获得该月的第一天