форматирование даты — PHP DateInterval январь — июнь и июль — декабрь

Попытка создать список или интервал дат за последние 2 года, разделенные на диапазоны по 6 месяцев, то есть январь-июнь 2015 г., июль-декабрь 2015 г., январь-июнь 2016 г. … до сегодняшнего дня.

Я посмотрел в DateTime и DateInterval, что-то вроде этого

$begin = new DateTime( '2015-01-01' );
$end = new DateTime( '2017-12-26' );

$interval = new DateInterval('P6M');

$period = new DatePeriod($begin, $interval, $end);

foreach ( $period as $dt )
echo sprintf("%s\n", $dt->format("Y-m-d"));

Что дает мне

2015-01-01
2015-07-01
2016-01-01
2016-07-01
2017-01-01
2017-07-01

Не могу понять, как получить начало и конец (1 января — 30 июня и 1 июля — 31 декабря) для каждого периода.

1

Решение

После добавления интервала вычтите один день из него. использование sub() а также new DateInterval('P1D'), что указывает на вычитание одного дня.

foreach ( $period as $dt )
echo sprintf(
"%s %s\n",
$dt->format("Y-m-d"),
$dt->add($interval)
->sub(new DateInterval('P1D'))
->format("Y-m-d"));

Это выводит:

2015-01-01 2015-06-30
2015-07-01 2015-12-31
2016-01-01 2016-06-30
2016-07-01 2016-12-31
2017-01-01 2017-06-30
2017-07-01 2017-12-31

Обновить: В комментариях вы также спросили, как указать, какую половину года представляет дата. Ответ слишком очевиден:

sprintf(
"%s %s %d\n",
$dt->format("Y-m-d"),
$dt->add($interval)
->sub(new DateInterval('P1D'))
->format("Y-m-d"),
$dt->format("n")/6
);

Заметка %d и соответствующий $dt->format("n")/6,

Вывод для меня:

2015-01-01 2015-06-30 1
2015-07-01 2015-12-31 2
2016-01-01 2016-06-30 1
2016-07-01 2016-12-31 2
2017-01-01 2017-06-30 1
2017-07-01 2017-12-31 2
2

Другие решения

Вы можете просто добавить размер интервала «-1» для каждого запуска следующим образом:

$begin = new DateTime( '2015-01-01' );
$end = new DateTime( '2017-12-26' );

$interval = new DateInterval('P6M');

$period = new DatePeriod($begin, $interval, $end);

$oneDay = new DateInterval("P1D");
$oneDay->invert=1; #just get the previous day as if("P-1D")
foreach ( $period as $dt ){
echo  $dt->format("Y-m-d"); #interval start
$dt->add($interval); #adding the interval size
$dt->add($oneDay);   #get the last day of the cur interval
echo "<br>";
echo $dt->format("Y-m-d");  #interval end
echo "<br>";
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector