2016-10-31 6 views
0

私は、これらのコードを持っているエラー日付期間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($start, $interval, $end) ; 

    foreach ($periods as $period) { 
     print_r($period -> date_format('Y-m')) ; echo "<br>"; 
    } 

しかし、私はこのメッセージで返されています:例外

キャッチされない例外が

タイプに遭遇しました。メッセージ:DatePeriod :: __ construct():このコンストラクタは、 (DateTimeInterface、DateInterval、int)または(DateTime Interface、 DateInterval、DateTime)引数としてOR(文字列)。

誰でも私を助けることができますか?

+0

てみてください。 –

答えて

2

構文エラーとオブジェクト初期化エラーがあります。

$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オブジェクトを受け入れ、ここで補正です。あなたはforeachの中でDateTimeInterfaceがあるはずintに合格しようとしているから

+0

おかげで...もっと鋭い目にする必要がある...:D – Mauliardiwinoto

0

あなたのエラーの結果を使用して、あなたが$periods変数を必要とする:手動http://php.net/manual/en/class.dateperiod.php

問題2をご確認ください。

我々は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クラスに存在する型ヒントをうまく満足させるものです。あなたはまた、手動でDatePeriodクラスをチェックアウトすることができ

(new DateTime())->setTimestamp($start) 


これは、関連する部分です。

0

問題がDatePeriodのためにここに$period = new DatePeriod($start, $interval, $end) ;

コンストラクタたです:

public DatePeriod::__construct (DateTimeInterface $start , DateInterval $interval , int $recurrences [, int $options ]) 

すなわち。 DateTimeInterface型オブジェクトが必要で、日付オブジェクトを渡しています。また、$ periodという名前のDatePeriodオブジェクトを作成し、foreachループで$ periodsを使用しようとしました。(入力ミスのようです) ここに答えがあります...私は試してみました。 $期間=新しいDatePeriod($新しい[ '最初']、$間隔、$新しい[ '最後'])に変更し

<?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/>"; 
     } 
    ?>