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) OR (DateTime Интерфейс, DateInterval, DateTime) ИЛИ (строка) в качестве аргументов.

Кто-нибудь может мне помочь?

+0

Try, чтобы изменить $ период = новый DatePeriod ($ новый [ 'первый'], $ интервал, $ новый [ 'последний']); –

ответ

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. Пожалуйста, проверьте ручной http://php.net/manual/en/class.dateperiod.php

Задача 2: Вам нужно $periods переменную, как вы использовали в Еогеасп

+0

спасибо, чувак ... нужно быть более острым глазом ...: D – Mauliardiwinoto

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 класс в руководстве.

0

Проблема здесь $period = new DatePeriod($start, $interval, $end) ;

Construtor для DatePeriod является:

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

т.е.. он ожидает объект типа DateTimeInterface, и вы передаете ему объект даты. также вы создали объект DatePeriod с именем $ period и пытаетесь использовать $ period в цикле foreach .. (похоже, опечатка) , хотя у вас есть ответы здесь ... вот что я пытался и работал для меня.

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