在给定初始日期和数量的情况下,创建 PHP 中连续每月日期的列表
Create a list of sequential monthly dates in PHP given initial date and quantity
我正在开发一个小型支付系统,必须在给定初始日期和支付次数的情况下生成一个支付天数列表(每月)。所以,例如:
鉴于:
startday: 2015/06/22
qtty: 6
我应该从初始日期 (22) 获取日期并生成一个包含 6 个连续月度日期的列表:
- 2015/06/22(如果应包括初始日期,并且大于今天)
- 2015/07/22
- 2015/08/24
- 2015/09/22
- 2015/10/22
- 2015/11/23
如您所见,生成的日期不应是周末 (sat/dom),如果可能的话,也不应是假期
有什么功能可以帮助我实现这个目标吗? TIA
我认为这可能会满足您的需求,包括节假日:
<?php
$startday = strtotime("2015/08/24");
$qtty = 5;
// Add as many holidays as desired.
$holidays = array();
$holidays[] = "4 Jul";
$holidays[] = "25 Dec";
for( $i = 0; $i < $qtty; $i++ ) {
$next_month = strtotime("+".$i." month", $startday); // Also works with "+ 30 days"
while( in_array(date("d M", $next_month), $holidays)) { // Is holiday
$next_month = strtotime("+ 1 day", $next_month);
if( date("N", $next_month) > 5 ) { // Is weekend
$next_month = strtotime("next Monday", $next_month); // or "previous Friday"
}
}
echo(date( "Y-m-d", $next_month) . '</br>');
}
?>
会回显
2015-08-25
2015-09-25
2015-10-26 // Because of weekend
2015-11-25
2015-12-28 // Because of Christmas and weekend
开始日期为 2015 年 10 月 31 日,输出将是:
2015-11-02 // Because of weekend
2015-12-01 // Because the 31st of Nov is the 1st of Dec
2015-12-31
2016-02-01 // Because the weekend
2016-03-02 // Because the 31st of Feb is the 2st of Mars (as 2016 is leep year)
作为一个很好的额外提示,取决于你想如何解决 1 月 31 日的问题,如果你想要每个月的最后一天,你总是可以使用以下方法:
$first_of_the_month = strtotime(date("Y-m-1", $startday));
$next_month = strtotime("+ 1 month", $first_of_the_month);
$last_of_the_month = date("Y-m-t", $next_month);
echo($last_of_the_month); // 2015-09-30
我正在开发一个小型支付系统,必须在给定初始日期和支付次数的情况下生成一个支付天数列表(每月)。所以,例如:
鉴于:
startday: 2015/06/22
qtty: 6
我应该从初始日期 (22) 获取日期并生成一个包含 6 个连续月度日期的列表:
- 2015/06/22(如果应包括初始日期,并且大于今天)
- 2015/07/22
- 2015/08/24
- 2015/09/22
- 2015/10/22
- 2015/11/23
如您所见,生成的日期不应是周末 (sat/dom),如果可能的话,也不应是假期
有什么功能可以帮助我实现这个目标吗? TIA
我认为这可能会满足您的需求,包括节假日:
<?php
$startday = strtotime("2015/08/24");
$qtty = 5;
// Add as many holidays as desired.
$holidays = array();
$holidays[] = "4 Jul";
$holidays[] = "25 Dec";
for( $i = 0; $i < $qtty; $i++ ) {
$next_month = strtotime("+".$i." month", $startday); // Also works with "+ 30 days"
while( in_array(date("d M", $next_month), $holidays)) { // Is holiday
$next_month = strtotime("+ 1 day", $next_month);
if( date("N", $next_month) > 5 ) { // Is weekend
$next_month = strtotime("next Monday", $next_month); // or "previous Friday"
}
}
echo(date( "Y-m-d", $next_month) . '</br>');
}
?>
会回显
2015-08-25
2015-09-25
2015-10-26 // Because of weekend
2015-11-25
2015-12-28 // Because of Christmas and weekend
开始日期为 2015 年 10 月 31 日,输出将是:
2015-11-02 // Because of weekend
2015-12-01 // Because the 31st of Nov is the 1st of Dec
2015-12-31
2016-02-01 // Because the weekend
2016-03-02 // Because the 31st of Feb is the 2st of Mars (as 2016 is leep year)
作为一个很好的额外提示,取决于你想如何解决 1 月 31 日的问题,如果你想要每个月的最后一天,你总是可以使用以下方法:
$first_of_the_month = strtotime(date("Y-m-1", $startday));
$next_month = strtotime("+ 1 month", $first_of_the_month);
$last_of_the_month = date("Y-m-t", $next_month);
echo($last_of_the_month); // 2015-09-30