我有2个约会.让我们说他们看起来像这样.
$start = 2010/12/24;
$end = 2012/01/05;
Run Code Online (Sandbox Code Playgroud)
我查询数据库以查找这两个日期之间的访问.我发现了一些.然后我填充一个名为stats的数组.
$stats['2010/12/25'] = 50;
$stats['2010/12/31'] = 25;
...
Run Code Online (Sandbox Code Playgroud)
如你所见,有几天不见了.我需要用零值填充缺失的日期.我在想这样的事情.(我已经从开始和结束日期开始提取日/月/年.
for($y=$start_year; $y <= $end_year; $y++) {
for($m=$start_month; $m <=$end_month; $m++) {
for($d=$start_day; $d <= $end_day; $d++) {
Run Code Online (Sandbox Code Playgroud)
这可以在一年中正常工作,但是几个月和几天都行不通.如果开始日是15日.将错过每个后续月份的第1-14天.我可以有这样的解决方案......
for($y=$start_year; $y <= $end_year; $y++) {
for($m=1; $m <13; $m++) {
$total_days = cal_days_in_month(CAL_GREGORIAN, $m, $y) + 1;
for($d=1; $d <= $total_days; $d++) {
Run Code Online (Sandbox Code Playgroud)
然后,我需要一堆if语句,确保开始和结束的月份和日期都有效.
有没有更好的方法呢?或者甚至可以在我的mysql查询中完成?
Mar*_*ker 15
只是为了演示PHP的一些较新的间隔处理方法的功能(pgl在他的回答中提到):
$startDate = DateTime::createFromFormat("Y/m/d","2010/12/24",new DateTimeZone("Europe/London"));
$endDate = DateTime::createFromFormat("Y/m/d","2012/01/05",new DateTimeZone("Europe/London"));
$periodInterval = new DateInterval( "P1D" ); // 1-day, though can be more sophisticated rule
$period = new DatePeriod( $startDate, $periodInterval, $endDate );
foreach($period as $date){
echo $date->format("Y-m-d") , PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)
是否需要PHP> = 5.3.0
编辑
如果您需要包含实际的结束日期,那么您需要在foreach()循环之前立即向$ endDate添加一天:
$endDate->add( $periodInterval );
Run Code Online (Sandbox Code Playgroud)
编辑#2
$startDate = new DateTime("2010/12/24",new DateTimeZone("Europe/London"));
$endDate = new DateTime("2012/01/05",new DateTimeZone("Europe/London"));
do {
echo $startDate->format("Y-m-d") , PHP_EOL;
$startDate->modify("+1 day");
} while ($startDate <= $endDate);
Run Code Online (Sandbox Code Playgroud)
对于PHP 5.2.0(如果启用了dateTime对象,则更早)