如何在PHP中返回两个日期之间的特定日期

时间:2018-09-27 12:59:12

标签: php date

我今天遇到了一个问题,也许其他人可能需要帮助,所以我在这里发布答案。

客户希望我保存两个给定日期之间的每个星期一和星期三的日期。

(开始日期和结束日期实际上都不是在星期一或星期三)。

答案在下面...

2 个答案:

答案 0 :(得分:2)

说明

首先将一周中所有需要的天保存在一个数组中。我正在使用短日期格式(D),但您可以使用长格式(l):

$days = ["Mon", "Wed"];   //If <PHP7 use $days = array("Mon", "Wed"); 

接下来,将开始日期和结束日期转换为时间戳记:

$starttimestamp = strtotime($start_date);
$endtimestamp = strtotime($end_date);

接下来,执行一个FOR循环,将每个周期增加86400微秒(恰好是1天)。这将为我们提供两天之间每天的新时间戳。为每个循环创建一个新的日期字符串:

for(  $j=$starttimestamp;  $j<=$endtimestamp;  $j+=86400)
{
    $tmpday = date('D',$j);
    ...
}

最后,执行in_array检查(例如,如果大海捞针),以查看DAY是否与我们要求的任何天数匹配:

for(  $j=$starttimestamp;  $j<=$endtimestamp;  $j+=86400)
{
    $tmpday = date('D',$j);

    if(in_array($tmpday, $avail_days) ){
           echo date('Y-m-d',$j);
    }
}

仅此而已。整个代码可以在下面看到。我希望这对以后的人有所帮助:

整个代码

$avail_days     = ["Mon", "Wed"];    //If <PHP7 use $days = array("Mon", "Wed"); 
$starttimestamp = strtotime($your_start_date);
$endtimestamp   = strtotime($your_end_date);

for( $j = $starttimestamp;  $j <= $endtimestamp;  $j += 86400 )
{

    $tmpday = date('D',$j);

    if(in_array($tmpday, $avail_days) ){

           echo date('Y-m-d',$j);  //This date has a day that matches your required days!

    }

}

答案 1 :(得分:2)

  • 您可以使用DateTimeDateInterval直接跳至下周的同一天,并使用diff()方法跟踪其是否超过结束日期。

代码:     

$next_monday    = new DateTime("next Monday");
$next_wednesday = new DateTime("next Wednesday");
$one_week = new DateInterval("P1W");
$end_date = new DateTime(date("Y-m-d")." +100 days");


$valid_dates = [];

while(true){
    if($next_monday->diff($end_date)->invert === 1){
        break;
    }
    $valid_dates[] = $next_monday->format("Y-m-d");
    if($next_wednesday->diff($end_date)->invert === 1){
        break;
    }
    $valid_dates[] = $next_wednesday->format("Y-m-d");
    $next_monday->add($one_week);
    $next_wednesday->add($one_week);
}


foreach($valid_dates as $each_date){
    echo $each_date," ",date("D",strtotime($each_date)),"<br/>"; // to cross verify whether it's really Monday or Wednesday or not. 
}

输出:

2018-10-01 Mon
2018-10-03 Wed
2018-10-08 Mon
2018-10-10 Wed
2018-10-15 Mon
2018-10-17 Wed
2018-10-22 Mon
2018-10-24 Wed
2018-10-29 Mon
2018-10-31 Wed
2018-11-05 Mon
2018-11-07 Wed
2018-11-12 Mon
2018-11-14 Wed
2018-11-19 Mon
2018-11-21 Wed
2018-11-26 Mon
2018-11-28 Wed
2018-12-03 Mon
2018-12-05 Wed
2018-12-10 Mon
2018-12-12 Wed
2018-12-17 Mon
2018-12-19 Wed
2018-12-24 Mon
2018-12-26 Wed
2018-12-31 Mon
2019-01-02 Wed

注意:

您可以在开始日期的86400上加上strtotime()秒,然后循环运行以检查连续的每一天(可以正常工作)。但是,如果您尝试添加86400 * 286400 * 5以跳过当前日期的2天或5天,那么如果您没有从开始日期的midnight开始循环,则会遇到问题。