对于定期付款(每月)我需要下一个月的所有月份,每月的第1个或每个月的15个月(每月)
但它也应保持31,30,28和29日期.
例如,2014年1月31日(第一个定期付款日期),2014年2月28日或2014年2月29日(第2个日期),2014年3月31日(第3个)......等等)
例如.1/15/2014,2/15/2014,3/15/2014,4/15/2014,5/15/2014 ..等等
您可以使用DatePeriod类:
这部分工作:
有一个问题d >= 29,然后在FEBRUARY之后的所有月份都会将付款注册到最后一天.
<?php
error_reporting(E_ALL);
$begin = new DateTime('2014-01-29');
$lastDayInterval = DateInterval::createFromDateString('last day of next month');
$monthInterval = new DateInterval('P1M');
$lastDays = new DatePeriod(clone $begin, $lastDayInterval, 12,
DatePeriod::EXCLUDE_START_DATE);
$addedMonthDays = new DatePeriod(clone $begin, $monthInterval, 12,
DatePeriod::EXCLUDE_START_DATE);
$lastDaysArray = array();
foreach ($lastDays as $lastDay) {
$lastDaysArray[] = $lastDay;
}
$addedMonthDaysArray = array();
foreach ($addedMonthDays as $addedMonthDay) {
$addedMonthDaysArray[] = $addedMonthDay;
}
for ($i = 0; $i < 12; $i++) {
if ($addedMonthDaysArray[$i] > $lastDaysArray[$i]) {
echo $lastDaysArray[$i]->format('Y-m-d') . PHP_EOL;
} else {
echo $addedMonthDaysArray[$i]->format('Y-m-d') . PHP_EOL;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
2014-02-28
2014-03-31
2014-04-30
2014-05-31
2014-06-30
2014-07-31
2014-08-31
2014-09-30
2014-10-31
2014-11-30
2014-12-31
2015-01-31
Run Code Online (Sandbox Code Playgroud)
附:
$begin = new DateTime('2014-01-28');
Run Code Online (Sandbox Code Playgroud)
它输出:
2014-02-28
2014-03-28
2014-04-28
2014-05-28
2014-06-28
2014-07-28
2014-08-28
2014-09-28
2014-10-28
2014-11-28
2014-12-28
2015-01-28
Run Code Online (Sandbox Code Playgroud)