获取PHP中最后一天的日期列表

时间:2011-10-04 11:54:58

标签: php

这些答案并不能完全符合我的要求:

Getting last month's date in php How to find the last day of the month from date?

我有以下代码,用于打印一个选择框,其中包含指定日期的所有月份的最后一天:

            $last_case_date = $this->query_end_date();
            $increm_date = "2011-06-01";

            echo '<select name = "end_interval">';
            $increm_date = date('Y-m-d', strtotime("$increm_date"));
            while($increm_date <= $last_case_date) {
                // next date is $increm_date + 1 month
                $increm_date = date('Y-m-d', strtotime("$increm_date + 1 months"));
                // then we want the last day of this new date
                $month = substr($increm_date, 5, 2);
                $year = substr($increm_date, 0, 4);
                $increm_date = $this->last_day_of_month($month, $year);
                echo '<option value = "'.$increm_date.'" selected = "selected"'.'>'.$increm_date.'</option>';
            }
            echo '</select>';

last_day_of_month就是这样:

   function last_day_of_month($month = '', $year = '') {
        if(empty($month)) {
            $month = date('m');
        }
        if(empty($year)) {
            $year = date('Y');
        }
        $result = strtotime("{$year}-{$month}-01");
        $result = strtotime('-1 second', strtotime('+1 months', $result));
        return date('Y-m-d', $result);
    }

我从here借来的。

发生的奇怪事情是我得到这些日期:

2011-07-31 2011-08-31 2011-10-31

但没有2011-09-30!它可能与9月只有30天或者其他事情有关吗?

有人能发现问题吗?我已经盯着它看了好几年....谢谢你:)。

4 个答案:

答案 0 :(得分:2)

你可以使用php的内置函数

date('t', $timestamp);

所以你的功能看起来像是:

function last_day_of_month($month = '', $year = '') {
    $month
        || $month = date('m');
    $year
        || $year = date('y');
    $timestamp = mktime(0, 0, 0, $month, 1, $year);
    return date('Y-m-t', $timestamp);
}

答案 1 :(得分:1)

要获取当月的最后一天,请使用:

date('Y-m-t', strtotime("$year-$month-01"))

't'代表“给定月份的天数”,即最后一天。无需添加和减去任何内容。

答案 2 :(得分:1)

下面将输出一个选择框,其中包含当前年度每个月最后一天的选项:

echo "<select>";    
for($i=1;$i<=12;$i++){    
     echo "<option>".date('Y-m-t', strtotime(date("Y")."-".$i."-01"))."</option>";    
}    
echo "</select>";

如果您想设置为其他年份,只需将date("Y")替换为"2010"。例如,您可以循环使用多年,运行代码以输出每个选项。

答案 3 :(得分:0)

我认为这是你的代码问题:

原来的$ increm_date是“2011-06-01”;

while循环中的某个点$ increm_date是2011-08-31(八月的最后一天)

在你添加一个月的周期中所以$ increm_date是2011-10-01(10月的第一天,而不是9月的最后一天)所以你打电话给last_day_of_month提供OCTOBER NOT SEPTEMBER。

我不确定这一点。测试尝试在调用last_day_of_month之前打印$ increm_date