在PHP中,是否有一种简单的方法来获取一个月的第一个和最后一个日期?

在PHP中,是否有一种简单的方法来获取一个月的第一个和最后一个日期?

In PHP, is there an easy way to get the first and last date of a month?

我只需要给出月份和年份,就可以获取格式为YYYY-MM-DD的月份的第一天和最后一天。 有没有一种简便的好方法?


1
2
$first = date('Y-m-d', mktime(0, 0, 0, $month, 1, $year));
$last = date('Y-m-t', mktime(0, 0, 0, $month, 1, $year));

请参阅PHP文档中的date()。


第一天总是YYYY-MM-01,不是吗?示例:date("Y-M-d", mktime(0, 0, 0, 8, 1, 2008))

最后一天是下个月第一天的前一天:

1
2
3
$date = new DateTime("2008-09-01");
$date->modify("-1 day");
echo $date->format("Y-m-d");


该月的第一天始终为1。
所以它将成为

1
YYYY-MM-01

最后一天可以计算为:

1
2
3
4
<?php
    $num = cal_days_in_month(CAL_GREGORIAN, 8, 2003); // 31
    echo"There was $num days in August 2003";
?>

1
2
3
4
5
<?php
echo"Month Start -" . $monthStart = date("Y-m-1") ."<br/>";
$num = cal_days_in_month(CAL_GREGORIAN, date("m"), date("Y"));
echo"Monthe End -" . $monthEnd = date("Y-m-".$num);
?>

好,首先很容易。

1
date ('Y-m-d', mktime(0,0,0,MM,01,YYYY));

最后有点棘手,但不多。

1
date ('Y-m-d', mktime(0,0,0,MM + 1,-1,YYYY));

如果我正确记得我的PHP日期资料...

**编辑-加!被殴打约一百万次...

帕特编辑:

最后一天应该是

1
date ('Y-m-d', mktime(0,0,0,$MM + 1,0,$YYYY)); // Day zero instead of -1

从这里(昨天下个月获取)标记为重复,因此我无法在此处添加评论,但是人们可以从那里得到错误的答案。

更正下个月的最后一天:

1
echo ((new DateTime(date('Y-m').'-01'))->modify('+1 month')->format('Y-m-t'));

在下个月的第一天更正一个:

1
echo ((new DateTime(date('Y-m').'-01'))->modify('+1 month')->format('Y-m-01'));

像这样的代码将从一月开始提供三月,所以这不是可以预期的。

echo ((new DateTime())->modify('+1 month')->format('Y-m-t'));


例;我想获得本月的第一天和最后一天。

1
2
3
4
5
$month   = (int) date('F');
$year    = (int) date('Y');

date('Y-m-d', mktime(0, 0, 0, $month + 1, 1, $year)); //first
date('Y-m-d', mktime(0, 0, 0, $month + 2, 0, $year)); //last

例如,当您在2015年1月9日运行此代码时,第一个和最后一个值将是顺序的;

1
2
2015-01-01
2015-01-31

经过测试。


尝试此操作以获取当月的天数:

1
$numdays = date('t', mktime(0, 0, 0, $m, 1, $Y));

用PHP做到这一点最简单的方法是

1
2
3
4
5
6
$dateBegin = strtotime("first day of last month");  
$dateEnd = strtotime("last day of last month");

echo date("MYDATEFORMAT", $dateBegin);  
echo"";        
echo date("MYDATEFORMAT", $dateEnd);

或最后一周

1
2
3
4
5
6
7
if (date('N', time()) == 7) {
$dateBegin = strtotime("-2 weeks Monday");
$dateEnd = strtotime("last Sunday");
} else {
$dateBegin = strtotime("Monday last week");
$dateEnd = strtotime("Sunday last week");  
}

还是去年

1
2
$dateBegin = strtotime("1/1 last year");
$dateEnd = strtotime("12/31 this year");

只是为了确认我没有错过任何结局:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$startDay = 1;

if (date("m") == 1) {
    $startMonth = 12;
    $startYear = date("Y") - 1;

    $endMonth = 12;
    $endYear = date("Y") - 1;
}
else {
    $startMonth = date("m") - 1;
    $startYear = date("Y");

    $endMonth = date("m") - 1;
    $endYear = date("Y");
}

$endDay = date("d") - 1;

$startDate = date('Y-m-d', mktime(0, 0, 0, $startMonth , $startDay, $startYear));
$endDate = date('Y-m-d', mktime(0, 0, 0, $endMonth, $endDay, $endYear));

顺便说一句@ZombieSheep解决方案

1
date ('Y-m-d', mktime(0,0,0,$MM + 1,-1,$YYYY));

不起作用应该是

1
date ('Y-m-d', mktime(0,0,0,$MM + 1,0,$YYYY)); // Day zero instead of -1

当然@Micha吗?萨比的公认解决方案是最简单的。


推荐阅读