我有这些代码,
$end = strtotime ('last day of previous month') ;
$start = strtotime ("-1 year +1 day", $end) ;
$new ['first'] = date ('Y-m-d',$start) ;
$new ['last'] = date ('Y-m-d',$end) ;
$interval = DateInterval::createFromDateString ('1 month') ;
$period = new DatePeriod($start, $interval, $end) ;
foreach ($periods as $period) {
print_r($period -> date_format('Y-m')) ; echo "<br>";
}
但是,我已经通过这条消息回复了:
遇到未捕获的异常
类型:异常
消息:DatePeriod :: __ construct():此构造函数接受其中之一 (DateTimeInterface,DateInterval,int)OR(DateTimeInterface, DateInterval,DateTime)OR(字符串)作为参数。
任何人都可以帮助我吗?
答案 0 :(得分:3)
您有语法错误和对象初始化错误。这是更正:
$end = strtotime ('last day of previous month') ;
$start = strtotime ("-1 year +1 day", $end) ;
$new['first'] = date ('Y-m-d', $start) ;
$new['last'] = date ('Y-m-d', $end) ;
$interval = DateInterval::createFromDateString ('1 months') ;
$periods = new DatePeriod(new DateTime($new['first']), $interval, new DateTime($new['last'])) ;
foreach ($periods as $period) {
print_r($period->format('Y-m')) ; echo "<br>";
}
问题1:DatePeriod
构造函数接受DateTime对象。请查看手册http://php.net/manual/en/class.dateperiod.php
问题2:您需要在foreach中使用$periods
变量
答案 1 :(得分:0)
尝试传入int
时应该有DateTimeInterface
,会导致您的错误。
如果我们查看DateTime
类的构造,我们会看到以下内容:
/**
* @param DateTimeInterface $start
* @param DateInterval $interval
* @param DateTimeInterface $end
* @param int $options Can be set to DatePeriod::EXCLUDE_START_DATE.
* @link http://php.net/manual/en/dateperiod.construct.php
* @since 5.3.0
*/
public function __construct (DateTimeInterface $start, DateInterval $interval, DateTimeInterface $end, $options=0) {}
通过转换为正确的数据类型可以很容易地解决这个问题:
$end = strtotime ('last day of previous month') ;
$start = strtotime ("-1 year", $end) ;
$new ['first'] = date ('Y-m-d',$start) ;
$new ['last'] = date ('Y-m-d',$end) ;
$interval = DateInterval::createFromDateString ('1 month') ;
$period = new DatePeriod((new DateTime())->setTimestamp($start), $interval, (new DateTime())->setTimestamp($end)) ;
哪个会成功满足DatePeriod
类中的类型提示。
这是相关部分:
(new DateTime())->setTimestamp($start)
您还可以查看手册中的DatePeriod
课程。
答案 2 :(得分:0)
问题出在$period = new DatePeriod($start, $interval, $end) ;
DatePeriod
的Construtor是:
public DatePeriod::__construct ( DateTimeInterface $start , DateInterval $interval , int $recurrences [, int $options ] )
即。它期望DateTimeInterface类型对象,并且您正在向它传递日期对象。你也创建了一个名为$ period的DatePeriod对象,并试图在foreach循环中使用$ period ..(看起来像拼写错误) 即使你在这里有答案......这是我为我尝试和工作的东西。
<?php
$end = strtotime ('last day of previous month') ;
$start = strtotime ("-1 year +1 day", $end) ;
$new ['first'] = date ('Y-m-d',$start) ;
$new ['last'] = date ('Y-m-d',$end) ;
$interval = DateInterval::createFromDateString ('1 month') ;
$period = new DatePeriod(new DateTime(date('Y-m-d',$start)), $interval, $end) ;
foreach ($period as $pd) {
print_r(date_format($pd,'Y-m')); echo "<br/>";
}
?>