这对大多数月份都适用,但例如2011年4月有5个星期六,因此返回的结果是23而不是30。
$last_saturday = date("j", strtotime('Fourth Saturday'.date('F o')));
last saturday
在某些情况下被解释为“上个星期六”。
以下是在Windows 7上使用PHP 5.3的我测试成功的方法:跳转到下一个月的第一天,然后查找上个星期六。
$nextMonthStart = mktime(0,0,0,date('m')+1,1,date('Y'));
$last_saturday = date("d.m.Y",strtotime("previous saturday", $nextMonthStart));
即使下个月的第一天是星期六,这对我也有效。
现今人们过于随意地使用strtotime
... 如果你想要真正的强硬派(并且稍微重新发明轮子),你可以使用我曾经为Moodle编写的这段代码,我想它还有一些新奇价值。 我是从这里复制来的。
2011年4月的最后一个星期日是find_day_in_month(-1, 0, 4, 2011)
,这意味着“从2011年4月的最后一天开始向后搜索,并告诉我找到的第一个星期日是什么时候”。
/**
* Calculate the number of days in a given month
*
* @param int $month The month whose day count is sought
* @param int $year The year of the month whose day count is sought
* @return int
*/
function days_in_month($month, $year) {
return intval(date('t', mktime(12, 0, 0, $month, 1, $year)));
}
/**
* ?
*
* @todo Document what this function does
* @param int $startday Defines the day from which to start searching (absolute value) and the direction in which to search (sign)
* @param int $weekday -1 if you don't want the function to match a specific weekday; 0 to 6 to match specific weekdays
* @param int $month The month wherein the day is sought
* @param int $year The year wherein the day is sought
* @return int
*/
function find_day_in_month($startday, $weekday, $month, $year) {
$daysinmonth = days_in_month($month, $year);
if($weekday == -1) {
// Don't care about weekday, so return:
// abs($startday) if $startday != -1
// $daysinmonth otherwise
return ($startday == -1) ? $daysinmonth : abs($startday);
}
// From now on we 're looking for a specific weekday
// Give "end of month" its actual value, since we know it
if($startday == -1) {
$startday = -1 * $daysinmonth;
}
// Starting from day $startday, the sign is the direction
if($startday < 1) {
$startday = abs($startday);
$lastmonthweekday = strftime('%w', mktime(12, 0, 0, $month, $daysinmonth, $year));
// This is the last such weekday of the month
$lastinmonth = $daysinmonth + $weekday - $lastmonthweekday;
if($lastinmonth > $daysinmonth) {
$lastinmonth -= 7;
}
// Find the first such weekday <= $startday
while($lastinmonth > $startday) {
$lastinmonth -= 7;
}
return $lastinmonth;
}
else {
$indexweekday = strftime('%w', mktime(12, 0, 0, $month, $startday, $year));
$diff = $weekday - $indexweekday;
if($diff < 0) {
$diff += 7;
}
// This is the first such weekday of the month equal to or after $startday
$firstfromindex = $startday + $diff;
return $firstfromindex;
}
}
https://github.com/briannesbitt/carbon
<?php
require 'vendor/autoload.php';
use Carbon\Carbon;
$date = Carbon::now();
$date = $date->lastOfMonth(Carbon::SATURDAY);
echo 'last saturday = '.$date->day;
$lastSaturDay= date('Y-m-d', strtotime('本月最后一个星期六'));
strtotime()
在其源代码中使用了真正的魔法。它可以做所有事情。 - Pekkastrtotime()
的文档很糟糕。 - Pekka