计算两个日期之间有多少天(星期一至星期三) - Woocommerce 预订?
Calculate how many days (Monday - Wednesday) between two dates - Woocommerce Bookings?
我正在努力计算 "days" 类型的 Woocommerce Bookings 的价格。如果某个日期范围内的价格(例如周一至周三或周三至周六或周日至周二...)高于其他日期。
到目前为止我知道有多少天:
$days = date_diff($from, $to)->format('%d');
这道题求出单日天数:calculate sundays between two dates
但是我怎样才能不仅得到 "sundays" 而且得到每个日期范围(例如从 6 到 2):
$sundays = intval($days / 7) + ($from->format('N') + $days % 7 >= 7);
我想我需要遍历 daterange 并使用这个公式,但我不知道如何做。
您可以使用完全不同的方法:
创建一个 DatePeriod 对象并循环遍历 Period 对象并在每次遇到范围时递增一个变量。
下面的代码实现了但是只有return个完整范围的数目:
$from='2018/09/1';
$to='2018/09/31';
$start='Sunday';
$end='Thursday';
$go=false;
$period=new DatePeriod(date_create($from),date_interval_create_from_date_string('1 days'),date_create($to));
$nRange=0;
foreach($period as $date){
if($date->format('l')===$start){
$go=true;
}
if($go&&$date->format('l')===$end){
$go=false;
$nRange++;
}
}
print_r($nRange);
输出:
4
它适用于任何选定的范围。
然而,如果需要在给定范围内完成或不完成任何有效日期,您可以这样更改以前的代码:
$from='2018/09/17';
$to='2018/09/31';
$start='Sunday';
$end='Thursday';
$day_num=['Monday'=>1,'Tuesday'=>2,'Wednesday'=>3,'Thursday'=>4,'Friday'=>5,'Saturday'=>6,'Sunday'=>7];
$start_num=$day_num[$start];
$end_num=$day_num[$end];
$period=new DatePeriod(date_create($from),date_interval_create_from_date_string('1 days'),date_create($to));
$nRange=0;
if($start_num===$end_num){
$valid_range=array_values($day_num);//keep the number of each day of the week
}
elseif($start_num>$end_num){
$valid_range=array_values($day_num);//keep the number of each day of the week
while($valid_range[0]!==$start_num){//rotate the values to keep the start day first
$pop=array_shift($valid_range);
array_push($valid_range,$pop);
}
$valid_range=array_slice($valid_range,array_search($start_num,$valid_range),$start_num-$end_num);//keep only the days in the chosen range
}else{
$valid_range=array_values($day_num);//keep the number of each day of the week
$valid_range=array_slice($valid_range,array_search($start_num,$valid_range),$end_num-$start_num); //keep only the days in the chosen range
}
$valid_range=array_flip($valid_range);//flip the array to make the search more fast
foreach($period as $date){
if(isset($valid_range[(int)$date->format('N')])){
$nRange++;
}
}
print_r($nRange);//output the number of valid days
输出:
6
我正在努力计算 "days" 类型的 Woocommerce Bookings 的价格。如果某个日期范围内的价格(例如周一至周三或周三至周六或周日至周二...)高于其他日期。
到目前为止我知道有多少天:
$days = date_diff($from, $to)->format('%d');
这道题求出单日天数:calculate sundays between two dates
但是我怎样才能不仅得到 "sundays" 而且得到每个日期范围(例如从 6 到 2):
$sundays = intval($days / 7) + ($from->format('N') + $days % 7 >= 7);
我想我需要遍历 daterange 并使用这个公式,但我不知道如何做。
您可以使用完全不同的方法: 创建一个 DatePeriod 对象并循环遍历 Period 对象并在每次遇到范围时递增一个变量。
下面的代码实现了但是只有return个完整范围的数目:
$from='2018/09/1';
$to='2018/09/31';
$start='Sunday';
$end='Thursday';
$go=false;
$period=new DatePeriod(date_create($from),date_interval_create_from_date_string('1 days'),date_create($to));
$nRange=0;
foreach($period as $date){
if($date->format('l')===$start){
$go=true;
}
if($go&&$date->format('l')===$end){
$go=false;
$nRange++;
}
}
print_r($nRange);
输出:
4
它适用于任何选定的范围。
然而,如果需要在给定范围内完成或不完成任何有效日期,您可以这样更改以前的代码:
$from='2018/09/17';
$to='2018/09/31';
$start='Sunday';
$end='Thursday';
$day_num=['Monday'=>1,'Tuesday'=>2,'Wednesday'=>3,'Thursday'=>4,'Friday'=>5,'Saturday'=>6,'Sunday'=>7];
$start_num=$day_num[$start];
$end_num=$day_num[$end];
$period=new DatePeriod(date_create($from),date_interval_create_from_date_string('1 days'),date_create($to));
$nRange=0;
if($start_num===$end_num){
$valid_range=array_values($day_num);//keep the number of each day of the week
}
elseif($start_num>$end_num){
$valid_range=array_values($day_num);//keep the number of each day of the week
while($valid_range[0]!==$start_num){//rotate the values to keep the start day first
$pop=array_shift($valid_range);
array_push($valid_range,$pop);
}
$valid_range=array_slice($valid_range,array_search($start_num,$valid_range),$start_num-$end_num);//keep only the days in the chosen range
}else{
$valid_range=array_values($day_num);//keep the number of each day of the week
$valid_range=array_slice($valid_range,array_search($start_num,$valid_range),$end_num-$start_num); //keep only the days in the chosen range
}
$valid_range=array_flip($valid_range);//flip the array to make the search more fast
foreach($period as $date){
if(isset($valid_range[(int)$date->format('N')])){
$nRange++;
}
}
print_r($nRange);//output the number of valid days
输出:
6