负DateInterval

use*_*584 18 php

我想创建一个带有负DateInterval的DatePeriod对象.

这将创建一个DatePeriod,从今天到2016年年份增加.

$this->Set('dates', new DatePeriod(new DateTime(), new DateInterval('P1Y'), new DateTime('2016-06-06')));
Run Code Online (Sandbox Code Playgroud)

我想从2016年开始,并使用负面的DateInterval向今年迈进

这样的事情可能会说明我的愿望

$this->Set('dates', new DatePeriod(new DateTime('2016-06-06'), new DateInterval('-P1Y'), new DateTime()));
Run Code Online (Sandbox Code Playgroud)

我无法在DatePeriod或DateInterval上找到有关如何执行此操作的任何扩展信息.我发现只有DateInterval可以被反转.

hij*_*ian 37

根据kevinpeno于2011年3月17日07:47在php.net的页面上关于DateInterval :: __ construct()的评论,你不能通过构造函数直接创建负DateIntervals:

new DateInterval('-P1Y'); // Exception "Unknown or bad format (-P1Y)"
Run Code Online (Sandbox Code Playgroud)

而不是这个,您需要创建一个正间隔并明确将其invert属性设置为1:

$di = new DateInterval('P1Y');
$di->invert = 1; // Proper negative date interval
Run Code Online (Sandbox Code Playgroud)

只是自己检查了上面的代码,它正是以这种方式工作.

  • "invert = 1"不返回任何异常,但仍会产生_positive_结果.DateInterval :: createFromDateString(' - 1天'); 然而,解决方案_does_ work.(为什么记录如此糟糕?) (3认同)
  • 这段代码实际上创建了一个带有负周期的 DateInterval,但 DatePeriod 对象仍然使用这个 $di 从过去到未来迭代。 (2认同)

And*_*oso 15

这需要一点点挖掘.我能够得到否定的唯一方法DateInterval是这样做:

$interval = DateInterval::createFromDateString('-1 day');
Run Code Online (Sandbox Code Playgroud)

然而,有一个问题.DatePeriod似乎不适用于负间隔.如果您将开始日期设置为结束日期之前,那么它根本不包含任何日期,如果您翻转以使开始日期在结束日期之后,则它会无限期地向后看.

您可能需要重新构建代码以使用DateTime::sub正数DateIntervalDateTime::add负数来循环使用日期.


小智 10

你可以使用sub http://php.net/manual/en/datetime.sub.php

这是一个例子

$startDate = new \DateTime('2018-01-08 13:54:06');
$startDate->sub(new \DateInterval('P1D'));
Run Code Online (Sandbox Code Playgroud)


Kin*_*nch 4

我自己尝试过,DatePeriod单独使用是不可能的,但我认为这是有道理的:它只是反映了时期,通常没有任何特定的顺序,因此无法重新排序(可以将其视为一组)。

据我所知,检索日期并按相反顺序排序的唯一方法是这样的

$result = array();
forech ($dateperiod as $date) {
  array_push ($result, $data);
}
Run Code Online (Sandbox Code Playgroud)

更新

$date = new DateTime('2016-06-06');
$i = new DateInterval('P1Y');
$now = new DateTime;
while ($date >= $now) {
  echo $date->format('c') . PHP_EOL;
  $date = $date->sub($i);
}
Run Code Online (Sandbox Code Playgroud)