我今天遇到了一个问题,也许其他人可能需要帮助,所以我在这里发布答案。
客户希望我保存两个给定日期之间的每个星期一和星期三的日期。
(开始日期和结束日期实际上都不是在星期一或星期三)。
答案在下面...
答案 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)
DateTime
和DateInterval
直接跳至下周的同一天,并使用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 * 2
或86400 * 5
以跳过当前日期的2天或5天,那么如果您没有从开始日期的midnight
开始循环,则会遇到问题。