2017-09-05 60 views
1

我希望用户能够选择日期范围和时间间隔以显示结果,例如“显示2017年1月1日至2017年4月1日期间的结果,按日期列出|周|月“在两个日期之间找到不同的长时间间隔

因此,如果他们选择了一天,我会在2017年1月1日之前将结果分组; 2017年1月2日; 2017年1月3日;等等......

如果他们选择了一周,那会是2017年1月1日; 2017年1月8日; 2017年1月15日;等等......

我现在使用的方法如下:

if(isset($chosenInterval) && ($chosenInterval == "week" || $chosenInterval == "day")) { 
    $timeFormat = "F j, Y"; 
} else { 
    $timeFormat = "F Y"; 
    $chosenInterval = "month"; 
} 

$start = (new DateTime($start))->modify('first day of this month'); 
$end  = (new DateTime($stop))->modify('first day of next month'); 
$interval = DateInterval::createFromDateString('1 '.$chosenInterval); 
$period = new DatePeriod($start, $interval, $end); 

foreach($period as $dt) { 
    $dataLabels[] = $dt->format($timeFormat); 
} 

的问题是,如果用户选择2017年1月8日 - 2017年1月20日,它仍包括所有的日期在一月。

理想的情况下它会显示:

  • 日:2017年1月8日; 2017年1月9日; ... 2017年1月19日; 2017年1月20日
  • 星期:2017年1月8日; 2017年1月15日
  • 月份:一月,2017年

如何做到这一点有什么建议?谢谢!

+0

任何特别的原因,为什么你不希望设置'$ start'和'$ end'到选择的开始和结束日期? – Aydin4ik

+0

@Aydin不是真的,我对DateTime对象不是很熟悉,所以我将代码从另一个类似的线程中解除。我试图删除修改部分,但遇到了一个错误,所以我放弃了这个想法。这样做确实让我更接近了,尽管我在2017年8月7日 - 2017年9月7日进行了一项测试,测试时间间隔为一个月,而我只有8月份回来 - 而不是9月份。任何想法为什么? – Matt

回答

0

如果日期在开始之前或结束之后,则需要检查何时将DateTime对象添加到$dataLabels。如果是(和$chosenInterval不是一个月),不添加他们:

<?php 
$start = "2017-01-08"; 
$stop = "2017-01-20"; 
$chosenInterval = "week"; 
function getDates($start, $stop, $chosenInterval = "week") { 
    $startDT = new DateTime($start); // make a DateTime out of the date to later compare it 
    $stopDT = new DateTime($stop); // make a DateTime out of the date to later compare it 
    if(isset($chosenInterval) && ($chosenInterval == "week" || $chosenInterval == "day")) { 
     $timeFormat = "F j, Y"; 
    } else { 
     $timeFormat = "F Y"; 
     $chosenInterval = "month"; 
    } 

    $begin = (new DateTime($start))->modify('first day of this month'); 
    $end  = (new DateTime($stop))->modify('first day of next month'); 
    $interval = DateInterval::createFromDateString('1 '.$chosenInterval); 
    $period = new DatePeriod($begin, $interval, $end); 

    foreach($period as $dt) { 
     if ($chosenInterval !== "month" && ($dt < $startDT || $dt > $stopDT)) continue; // if date is before start or after end, skip 
     $dataLabels[] = $dt->format($timeFormat); 
    } 
    return $dataLabels; 
} 
var_dump(getDates($start, $stop)); 
var_dump(getDates($start, $stop, "day")); 
var_dump(getDates($start, $stop, "month")); 

Demo

相关问题