在PHP中,如何知道这个月的正常运行时间已经过去了多少个星期一?

在PHP中,如何知道这个月的正常运行时间已经过去了多少个星期一?,php,date,recurrence,Php,Date,Recurrence,假设今天是2011年2月21日星期一。这是本月的第三个星期一。如果输入日期,我怎么知道在它之前已经过了多少个星期一 在PHP中,如何知道本月的正常运行时间已过了多少个星期一?您可以循环查看到现在为止的所有日子,并计算星期一: $firstDate = mktime(0, 0, 0, date("n"), 1, date("Y")); $now = time(); $mondays = 0; for ($i = $firstDate; $i < $now; $i = $i + 24*3600

假设今天是2011年2月21日星期一。这是本月的第三个星期一。如果输入日期,我怎么知道在它之前已经过了多少个星期一


在PHP中,如何知道本月的正常运行时间已过了多少个星期一?

您可以循环查看到现在为止的所有日子,并计算星期一:

$firstDate = mktime(0, 0, 0, date("n"), 1, date("Y"));
$now = time();
$mondays = 0;
for ($i = $firstDate; $i < $now; $i = $i + 24*3600) {
    if (date("D", $i) == "Mon")
        $mondays ++;
}

尚未测试此脚本

您可以循环到目前为止的所有日子,并计算星期一:

$firstDate = mktime(0, 0, 0, date("n"), 1, date("Y"));
$now = time();
$mondays = 0;
for ($i = $firstDate; $i < $now; $i = $i + 24*3600) {
    if (date("D", $i) == "Mon")
        $mondays ++;
}

我还没有测试过这个脚本,它听起来像是一个非常简单的除法计算。从当前日期减去上周一过去的天数,例如:星期三=-2,除以7,然后将其加起来


编辑:这将包括数字中的当前星期一,返回星期一21的3。

这听起来像是一个非常简单的除法计算。从当前日期减去上周一过去的天数,例如:星期三=-2,除以7,然后将其加起来

$now=time() + 86400;
if (($dow = date('w', $now)) == 0) $dow = 7; 
$begin = $now - (86400 * ($dow-1));

echo "Mondays: ".ceil(date('d', $begin) / 7)."<br/>";
编辑:这将包括数字中的当前星期一,返回3表示星期一21

$now=time() + 86400;
if (($dow = date('w', $now)) == 0) $dow = 7; 
$begin = $now - (86400 * ($dow-1));

echo "Mondays: ".ceil(date('d', $begin) / 7)."<br/>";
为我工作

编辑:也包括今天的星期一

    <?php

 function mondays_get($month, $stop_if_today = true) {

$timestamp_now = time();

for($a = 1; $a < 32; $a++) {

    $day = strlen($a) == 1 ? "0".$a : $a;
    $timestamp = strtotime($month . "-$day");
    $day_code = date("w", $timestamp);
    if($timestamp > $timestamp_now)
        break;
    if($day_code == 1)
        @$mondays++;

}

return $mondays;
}

echo mondays_get('2011-02');
为我工作

编辑:也包括今天的星期一

    <?php

 function mondays_get($month, $stop_if_today = true) {

$timestamp_now = time();

for($a = 1; $a < 32; $a++) {

    $day = strlen($a) == 1 ? "0".$a : $a;
    $timestamp = strtotime($month . "-$day");
    $day_code = date("w", $timestamp);
    if($timestamp > $timestamp_now)
        break;
    if($day_code == 1)
        @$mondays++;

}

return $mondays;
}

echo mondays_get('2011-02');
希望这对你有用!我刚把它卷起来

注意上面代码中的错误;我只是证明它是正确的,没有试过

很好用

希望这对你有用!我刚把它卷起来

注意上面代码中的错误;我只是证明它是正确的,没有试过

很好用

试试这个

//find the most recent monday (doesn't find today if today is Monday though)
$startDate = strtotime( 'last monday' );

//if 'last monday' was not this month, 0 mondays.  
//if 'last monday' was this month, count the weeks
$mondays = date( 'm', $startDate ) != date( 'm' ) 
         ? 0 
         : floor( date( 'd', $startDate ) / 7 );

//increment the count if today is a monday (since strtotime didn't find it)
if ( date( 'w' ) == 1 ) $mondays++;
试试这个

//find the most recent monday (doesn't find today if today is Monday though)
$startDate = strtotime( 'last monday' );

//if 'last monday' was not this month, 0 mondays.  
//if 'last monday' was this month, count the weeks
$mondays = date( 'm', $startDate ) != date( 'm' ) 
         ? 0 
         : floor( date( 'd', $startDate ) / 7 );

//increment the count if today is a monday (since strtotime didn't find it)
if ( date( 'w' ) == 1 ) $mondays++;

另一种方法是找到今天是一周中的哪一天,通过一些神奇的strotime找到一个月中的第一天,然后计算这一天与现在的周数之差。请参阅下面的函数,该函数将采用Y-m-d格式的日期并返回该月的哪个工作日

注意:strotime需要详细说明,包括的和月份:2011-02年的第一个星期一,否则为空。当我测试边缘案例时,这让我感到很难受

还添加了一些显示胡椒粉,这是完全可选的,但我觉得它

function nthWeekdayOfMonth($day) {

    $dayTS = strtotime($day) ;

    $dayOfWeekToday = date('l', $dayTS) ;

    $firstOfMonth = date('Y-m', $dayTS) . "-01" ;
    $firstOfMonthTS = strtotime($firstOfMonth) ;

    $firstWhat = date('Y-m-d', strtotime("first $dayOfWeekToday of $monthYear", $firstOfMonthTS)) ;
    $firstWhatTS = strtotime($firstWhat) ;

    $diffTS = $dayTS - $firstWhatTS ;
    $diffWeeks = $diffTS / (86400 * 7);

    $nthWeekdayOfMonth = $diffWeeks + 1;

    return $nthWeekdayOfMonth ;
}

$day = date('Y-m-d') ;
$nthWeekdayOfMonth = nthWeekdayOfMonth($day) ;

switch ($nthWeekdayOfMonth) {
    case 1: 
        $inflector = "st" ;
        break ;
    case 2: 
        $inflector = "nd" ;
        break ;
    case 3: 
        $inflector = "rd" ;
        break ;
    default:
        $inflector = "th" ;
}

$dayTS = strtotime($day) ;

$monthName = date('F', $dayTS) ;    
$dayOfWeekToday = date('l', $dayTS) ;

echo "Today is the {$nthWeekdayOfMonth}$inflector $dayOfWeekToday in $monthName" ;

另一种方法是找到今天是一周中的哪一天,通过一些神奇的strotime找到一个月中的第一天,然后计算这一天与现在的周数之差。请参阅下面的函数,该函数将采用Y-m-d格式的日期并返回该月的哪个工作日

注意:strotime需要详细说明,包括的和月份:2011-02年的第一个星期一,否则为空。当我测试边缘案例时,这让我感到很难受

还添加了一些显示胡椒粉,这是完全可选的,但我觉得它

function nthWeekdayOfMonth($day) {

    $dayTS = strtotime($day) ;

    $dayOfWeekToday = date('l', $dayTS) ;

    $firstOfMonth = date('Y-m', $dayTS) . "-01" ;
    $firstOfMonthTS = strtotime($firstOfMonth) ;

    $firstWhat = date('Y-m-d', strtotime("first $dayOfWeekToday of $monthYear", $firstOfMonthTS)) ;
    $firstWhatTS = strtotime($firstWhat) ;

    $diffTS = $dayTS - $firstWhatTS ;
    $diffWeeks = $diffTS / (86400 * 7);

    $nthWeekdayOfMonth = $diffWeeks + 1;

    return $nthWeekdayOfMonth ;
}

$day = date('Y-m-d') ;
$nthWeekdayOfMonth = nthWeekdayOfMonth($day) ;

switch ($nthWeekdayOfMonth) {
    case 1: 
        $inflector = "st" ;
        break ;
    case 2: 
        $inflector = "nd" ;
        break ;
    case 3: 
        $inflector = "rd" ;
        break ;
    default:
        $inflector = "th" ;
}

$dayTS = strtotime($day) ;

$monthName = date('F', $dayTS) ;    
$dayOfWeekToday = date('l', $dayTS) ;

echo "Today is the {$nthWeekdayOfMonth}$inflector $dayOfWeekToday in $monthName" ;

使用这种方法,我们可以循环得到上周一,直到上周一的日期属于前一个月。现在可以了,但我还是更喜欢Kaivosukeltaja的解决方案,简单得多,只需要一些基础数学就可以了。使用这种方法,我们可以循环得到上周一,直到上周一的日期属于前一个月。固定脚本,j应该是一个n。现在可以了,但我还是更喜欢Kaivosukeltaja的解决方案,简单得多,只需要一些基础数学就可以了。2月21日有效,但2月1日无效。如果他以2011年2月1日为例,你会在周二的2月1日返回1,或者如果他不小心,他可能会在1月份返回周一的数字。我的错误,用词不当。我所说的日期是指一个月的哪一天。所以从1中减去1,因为它是星期二,结果是0,这四舍五入为0。对,核心公式是ceil day of of the月/7。但是在你的例子中,你需要减去wed的天数-2,因为他要求星期一。@Justin:是的,我相信我的回答中提到过@Kaivosukeltaja:同意:-很抱歉在我的评论的后半部分措词不当。我只是想让我更容易理解这里发生了什么。。。也许它会帮助下一个家伙,也许不是……在2月21日工作,但不是在2月1日。如果他以2011年2月1日为例,你会在周二的2月1日返回1,或者如果他不小心,他可能会在1月份返回周一的数字。我的错误,用词不当。我所说的日期是指一个月的哪一天。所以从1中减去1,因为它是星期二,结果是0,这四舍五入为0。对,核心公式是ceil day of of the月/7。但是在你的例子中,你需要减去wed的天数-2,因为他要求星期一。@Justin:是的,我相信我的回答中提到过@Kaivosukeltaja:同意:-很抱歉在我的评论的后半部分措词不当。我只是想让我更容易理解这里发生了什么。。。也许它会帮助下一个人,也许不会。。。