因此,我有一个返回特定月份和年份的周数的脚本。如何从该月中选择特定的一天,并确定它是该月的第1、2、3、4或5周的一部分吗?
发布于 2011-05-02 13:41:38
这是我尝试过的最令人沮丧的事情--但它就在这里!
<?php
/**
* Returns the amount of weeks into the month a date is
* @param $date a YYYY-MM-DD formatted date
* @param $rollover The day on which the week rolls over
*/
function getWeeks($date, $rollover)
{
$cut = substr($date, 0, 8);
$daylen = 86400;
$timestamp = strtotime($date);
$first = strtotime($cut . "00");
$elapsed = ($timestamp - $first) / $daylen;
$weeks = 1;
for ($i = 1; $i <= $elapsed; $i++)
{
$dayfind = $cut . (strlen($i) < 2 ? '0' . $i : $i);
$daytimestamp = strtotime($dayfind);
$day = strtolower(date("l", $daytimestamp));
if($day == strtolower($rollover)) $weeks ++;
}
return $weeks;
}
//
echo getWeeks("2011-06-11", "sunday"); //outputs 2, for the second week of the month
?>
发布于 2012-11-01 04:51:32
编辑:这就是“单行”所需的变量,以避免与条件的重新计算。当我在它的时候抛出了一个默认的参数。
function weekOfMonth($when = null) {
if ($when === null) $when = time();
$week = date('W', $when); // note that ISO weeks start on Monday
$firstWeekOfMonth = date('W', strtotime(date('Y-m-01', $when)));
return 1 + ($week < $firstWeekOfMonth ? $week : $week - $firstWeekOfMonth);
}
请注意,weekOfMonth(strtotime('Oct 31, 2011'));
将返回6
;一些罕见的月份有6周,这与OP的预期相反。2017年1月是另一个具有6个ISO周的月份-周日是去年一周的第一个秋季,因为ISO周从周一开始。
对于starshine531,要返回0
索引的当月周,请将return 1 +
更改为return 0 +
或return (int)
。
对于Justin Stayton,从周日而不是周一开始的几周内,我会使用strftime('%U'
而不是date('W'
,如下所示:
function weekOfMonth($when = null) {
if ($when === null) $when = time();
$week = strftime('%U', $when); // weeks start on Sunday
$firstWeekOfMonth = strftime('%U', strtotime(date('Y-m-01', $when)));
return 1 + ($week < $firstWeekOfMonth ? $week : $week - $firstWeekOfMonth);
}
对于此版本,2017-04-30现在是4月的第6周,而2017-01-31现在是第5周。
发布于 2012-07-19 02:59:03
public function getWeeks($timestamp)
{
$maxday = date("t",$timestamp);
$thismonth = getdate($timestamp);
$timeStamp = mktime(0,0,0,$thismonth['mon'],1,$thismonth['year']); //Create time stamp of the first day from the give date.
$startday = date('w',$timeStamp); //get first day of the given month
$day = $thismonth['mday'];
$weeks = 0;
$week_num = 0;
for ($i=0; $i<($maxday+$startday); $i++) {
if(($i % 7) == 0){
$weeks++;
}
if($day == ($i - $startday + 1)){
$week_num = $weeks;
}
}
return $week_num;
}
大家好,我已经挣扎了一整天,试图弄清楚这段代码,我终于弄明白了,所以我想我应该和大家分享一下。
您所需要做的就是在函数中添加一个时间戳,它会将星期数返回给您。
谢谢
https://stackoverflow.com/questions/5853380
复制相似问题