DatePeriod对象中缺少日期

时间:2016-02-10 09:37:58

标签: php datetime

我有以下脚本。我创建一个起始日期时间对象和结束日期时间对象。然后我创建一个具有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)

1 个答案:

答案 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可以让您获得该月的第一天