【问题标题】:In PHP, how to know how many mondays have passed in this month uptil today?在 PHP 中,如何知道这个月到今天已经过去了多少个星期一?
【发布时间】:2011-02-21 18:51:05
【问题描述】:

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

在 PHP 中,如何知道这个月到今天已经过了多少个星期一?

【问题讨论】:

    标签: php date recurrence


    【解决方案1】:
    $now=time() + 86400;
    if (($dow = date('w', $now)) == 0) $dow = 7; 
    $begin = $now - (86400 * ($dow-1));
    
    echo "Mondays: ".ceil(date('d', $begin) / 7)."<br/>";
    

    为我工作....

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

    【讨论】:

      【解决方案2】:

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

      编辑:这将在数字中包含当前星期一,返回“3”表示 21 号星期一。

      【讨论】:

      • 适用于 2 月 21 日,但不适用于 2 月 1 日。如果他以 2011 年 2 月 1 日为例,您将在 2 月 1 日星期二返回“1”,(或者如果他是不小心,他可能会返回一月份的星期一数)。
      • 我的错误,选词不当。 “日期”是指“一个月中的某天”。因此,从 1 中减去 1(因为是星期二)得到 0,四舍五入为零。
      • 对,核心公式是ceil( day_of_month / 7 )。但是,自从他要求星期一以来,您需要减去天数(在您的示例中为-2)。
      • @Justin:是的,我相信我的回答中提到了这一点。 :)
      • @Kaivosukeltaja:同意 :) - 抱歉我评论后半部分措辞不佳。我只是想让我更容易理解这里发生了什么......也许它会帮助下一个人,也许不会......
      【解决方案3】:
          <?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');
      

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

      “小心以上代码中的错误;我只是证明它是正确的,没有尝试过。”

      工作正常,afaik

      【讨论】:

        【解决方案4】:

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

        $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 ++;
        }
        

        没有测试过这个脚本

        【讨论】:

        • 使用这种方法,我们可以循环获取“上周一”直到last monday的日期属于上个月
        • 修正了脚本,j 应该是 n。它现在可以工作了,但我仍然更喜欢 Kaivosukeltaja 的解决方案,用一些基本的数学来完成它要简单得多。
        【解决方案5】:

        试试这个...

        //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++;
        

        【讨论】:

          【解决方案6】:

          另一种方法是找出今天是星期几,通过某种魔法strtotime() 找到一个月中的第一个这样的日子,然后计算那个和现在之间的差(以周为单位)。请参阅下面的函数,该函数将采用 Y-m-d 格式的 date() 并返回该月的哪个工作日。

          注意:strtotime 需要详细,包括“of”和月份:“2011-02 的第一个星期一”,否则为 advances one day。当我测试边缘情况时,这让我很受不了。

          还添加了一些完全可选的展示辣椒,但我喜欢它。

          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" ;
          

          【讨论】:

            猜你喜欢
            • 2016-10-08
            • 2016-05-20
            • 2013-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-08
            相关资源
            最近更新 更多