如何按月在两个指定日期之间进行迭代

时间:2009-12-18 05:31:57

标签: php datetime

我有几个月前推出的网站。我想编写一些代码,每个月都会查看,自启动以来,并抓住该月的指标。

我的问题是:指定开始日期,然后按月迭代,一直到当前月份(或另一个指定日期)的最佳方法是什么。

有没有人有任何建议?我正在使用PHP和mySQL数据库。

5 个答案:

答案 0 :(得分:6)

您可以使用strtotime将日期增加+1 month

$date1 = strtotime('2009-01-01');
$date2 = strtotime('2010-01-01');

while ($date1 <= $date2) {
  echo date('Y-m-d', $date1) . "\n";
  $date1 = strtotime('+1 month', $date1);
}

如果您有PHP&gt; = 5.3.0,则可以将DateTime::addDateInterval对象一起使用

检查上面的示例here

答案 1 :(得分:1)

$start_date = mktime(0, 0, 0, 1, 1, 2009);
$end_date = mktime(0, 0, 0, 10, 1, 2009);

$current_date = $start_date;
while($current_date <= $end_date) {
     $current_date = strtotime("+1 month", $current_date);
}

这是一种方法。另一个包括分别在几个月和几年内的两个循环。

但是,如果您熟悉SQL,则可以在数据库中获取所有指标和GROUP BY EXTRACT(YEAR_MONTH FROM date),这很可能会更快。

答案 2 :(得分:1)

我不知道您存储的指标的架构,所以这是一个通用示例:

从8月1日至2009年11月30日选择每月的总浏览量

MySQL的代码:

SELECT DATE_FORMAT(s.date, '%Y-%m') AS  year_month , SUM( s.pageviews ) AS  s.pageviews_total 
FROM statistics s
WHERE s.date BETWEEN '2009-08-01' AND '2009-11-30'
GROUP BY DATE_FORMAT(s.date, '%Y-%m') 
ORDER BY DATE_FORMAT(s.date, '%Y-%m')

拥有聚合表输出可能就足够了。如果没有,您可以使用PHP循环它并执行其他操作。

答案 3 :(得分:1)

我有一个结果最佳的方法:

$begin = new DateTime( '2014-07-14' );
$end = new DateTime( '2014-08-01' );
$end = $end->modify( '+1 month' );
$interval = DateInterval::createFromDateString('1 month');

$period = new DatePeriod($begin, $interval, $end);

foreach($period as $dt) {
    var_dump($dt->format( "m" ));
}

希望这会有所帮助。

答案 4 :(得分:0)

如果您从30个月的最后一天开始,您可能会在使用“+1个月”之间失去一个月。请尝试从2015-06-30到2015-12-31,例如,它将跳过2015年9月。

我建议使用“下个月的第一天”,而不是使用“+1月”,而不是:

$begin = new DateTime( '2015-06-30' );
$end = new DateTime( '2015-12-31' );
$end = $end->modify( 'first day of next month' );
$interval = DateInterval::createFromDateString('first day of next month');

$period = new DatePeriod($begin, $interval, $end);

foreach($period as $dt) {
    var_dump($dt->format( "m" ));
}

这也将列出2015年9月。