Php 如何查找一个月的最后一个星期一
我不知道该怎么办。我正在用PHP构建日历,需要用户能够添加符合以下规则的重复事件: 本月最后一个[道指](本周最后一个[周一/周二/周三/等]) 我已经存储了规则本身,我只是不确定如何最好地用PHP推断每月的最后一个周一/周二/周三?我觉得我把事情弄得比实际需要的更复杂了Php 如何查找一个月的最后一个星期一,php,Php,我不知道该怎么办。我正在用PHP构建日历,需要用户能够添加符合以下规则的重复事件: 本月最后一个[道指](本周最后一个[周一/周二/周三/等]) 我已经存储了规则本身,我只是不确定如何最好地用PHP推断每月的最后一个周一/周二/周三?我觉得我把事情弄得比实际需要的更复杂了 假设你有$month=4,$dow=3和$year=2011变量,我最好怎么做?对于所有与日期相关的,你可以用正统英语表达,但很难用数字表达的,你是最好的朋友 echo strtotime("last Monday of Ju
假设你有
$month=4
,$dow=3
和$year=2011
变量,我最好怎么做?对于所有与日期相关的,你可以用正统英语表达,但很难用数字表达的,你是最好的朋友
echo strtotime("last Monday of June 2011");
这将返回一个时间戳,您可以将其用作第二个参数,并希望获得一个正确的、人类可读的日期。因为它是用C编写的内置函数,所以这个解决方案也比用PHP编写的任何其他解决方案都要快得多(尽管我很确定这在现实场景中不会有多大影响)
因此,假设您有
$month=4
,$dow=3
和$year=2011
,您需要一个数组将$month
值映射到它们的英文文本表示形式,另一个数组将$dow
值映射到它们的文本表示形式。我有一个通用函数供您计算一个月的第n天。希望这能帮助您解决您的问题
function get_Nth_dow($dow, $occurence, $m, $y)
{
$numdays = date('t', mktime(0, 0, 0, $m, 1, $y));
$add = 7 * ($occurence - 1);
$firstdow = date('w', mktime(0, 0, 0, $m, 1, $y));
$diff = $firstdow - $dow;
$day_of_month = 1;
if ($diff > 0)
{
$day_of_month += ($add - $diff);
}
elseif ($diff < $numdays)
{
$day_of_month -= ($diff - $add);
}
return $day_of_month;
}
函数get\n\u dow($dow,$occurrence,$m,$y)
{
$numdays=日期('t',mktime(0,0,0,m,1,y));
$add=7*($occurrence-1);
$firstdow=日期('w',mktime(0,0,0,m,1,y));
$diff=$firstdow-$dow;
$day\u/u月=1;
如果($diff>0)
{
$day\u of_month+=($add-$diff);
}
elseif($diff<$numdays)
{
$day\u of_month-=($diff-$add);
}
返回每月的$day\u;
}
$DOW
=一周中的某一天(0=周日,6=周六)
$X
=发生(1=第一个,2=第三个,等等)。如果给定的月份
没有发生,则返回最后一个。例如,如果
如果您请求星期五的第7个事件,它将返回最后一个事件
本月的星期五。
$M
=月
$Y
=年
例如,获得道指(2,3,72009)
将返回2009年7月7日的第三个星期二。这里有一个替代方案:
<?
function lastDayOfMonth($month, $year) {
switch ($month) {
case 2:
# if year is divisible by 4 and not divisible by 100
if (($year % 4 == 0) && ($year % 100) > 0)
return 29;
# or if year is divisible by 400
if ($year % 400 == 0)
return 29;
return 28;
case 4:
case 6:
case 9:
case 11:
return 30;
default:
return 31;
}
}
function lastDayOfWeek($month, $year, $dow) {
$d = new DateTime();
#Finding the last day of month
$d = $d->setDate($year, $month, lastDayOfMonth($month, $year));
#Getting the day of week of last day of month
$date_parts = getdate($d->getTimestamp());
$diff = 0;
#if we can't find the $dow in this week... (cause it would lie on next month)
if ($dow > $date_parts['wday']) {
# ...we go back a week.
$diff -= 7;
}
return $date_parts['mday'] + $diff + ($dow - $date_parts['wday']);
}
# checking the algorithm for this month...
for ($i=0; $i < 7; $i++) {
echo lastDayOfWeek(6,2011,$i) . "<br>";
}
?>
请注意:确保不要忘记
的。