我希望用户能够选择日期范围和间隔来显示结果,例如“显示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日,它仍然包括1月份的所有日期。
理想情况下会显示:
有关如何完成此任务的任何建议?谢谢!
答案 0 :(得分: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"));