【问题标题】:In PHP, is there an easy way to get the first and last date of a month?在 PHP 中,有没有一种简单的方法来获取一个月的第一个和最后一个日期?
【发布时间】:2010-09-07 19:11:52
【问题描述】:

我需要以 YYYY-MM-DD 格式获取一个月的第一天和最后一天,仅给出月份和年份。有没有一种好的、简单的方法来做到这一点?

【问题讨论】:

  • 我觉得要求一个月的第一天有点愚蠢....:\

标签: php


【解决方案1】:

第一天总是 YYYY-MM-01,不是吗?示例:date("Y-M-d", mktime(0, 0, 0, 8, 1, 2008))

最后一天是下个月第一天的前一天:

$date = new DateTime("2008-09-01");
$date->modify("-1 day");
echo $date->format("Y-m-d");

【讨论】:

    【解决方案2】:

    每月的第一天总是 1。 所以会变成

    YYYY-MM-01
    

    最后一天可以计算为:

    <?php
        $num = cal_days_in_month(CAL_GREGORIAN, 8, 2003); // 31
        echo "There was $num days in August 2003";
    ?>
    

    【讨论】:

      【解决方案3】:
      $first = date('Y-m-d', mktime(0, 0, 0, $month, 1, $year));
      $last = date('Y-m-t', mktime(0, 0, 0, $month, 1, $year));
      

      请参阅 PHP 文档中的 date()

      【讨论】:

      • $month 之后的“1”是什么?
      • 没有意识到只需添加“t”就可以做出如此出色的解决方案。干净简单。
      【解决方案4】:

      好的,首先很容易。

      date ('Y-m-d', mktime(0,0,0,MM,01,YYYY));
      

      最后一个有点棘手,但不多。

      date ('Y-m-d', mktime(0,0,0,MM + 1,-1,YYYY));
      

      如果我没记错我的 PHP 日期...

      **编辑 - 啊!被它打败了大约一百万次......

      Pat 编辑:

      应该是最后一天

      date ('Y-m-d', mktime(0,0,0,$MM + 1,0,$YYYY)); // Day zero instead of -1
      

      【讨论】:

        【解决方案5】:

        顺便@ZombieSheep解决方案

        date ('Y-m-d', mktime(0,0,0,$MM + 1,-1,$YYYY));
        

        应该是不行的

        date ('Y-m-d', mktime(0,0,0,$MM + 1,0,$YYYY)); // Day zero instead of -1
        

        当然,@Michał Słaby 接受的解决方案是最简单的。

        【讨论】:

          【解决方案6】:

          只是为了验证我没有遗漏任何内容:

          $startDay = 1;
          
          if (date("m") == 1) {
              $startMonth = 12;
              $startYear = date("Y") - 1;
          
              $endMonth = 12;
              $endYear = date("Y") - 1;
          }
          else {
              $startMonth = date("m") - 1;
              $startYear = date("Y");
          
              $endMonth = date("m") - 1;
              $endYear = date("Y");
          }
          
          $endDay = date("d") - 1;
          
          $startDate = date('Y-m-d', mktime(0, 0, 0, $startMonth , $startDay, $startYear));
          $endDate = date('Y-m-d', mktime(0, 0, 0, $endMonth, $endDay, $endYear));
          

          【讨论】:

            【解决方案7】:
            <?php
            echo "Month Start - " . $monthStart = date("Y-m-1") . "<br/>";
            $num = cal_days_in_month(CAL_GREGORIAN, date("m"), date("Y"));
            echo "Monthe End - " . $monthEnd = date("Y-m-".$num);
            ?>
            

            【讨论】:

              【解决方案8】:

              使用 PHP 最简单的方法是

              $dateBegin = strtotime("first day of last month");  
              $dateEnd = strtotime("last day of last month");
              
              echo date("MYDATEFORMAT", $dateBegin);  
              echo "<br>";        
              echo date("MYDATEFORMAT", $dateEnd);
              

              或者上周

              if (date('N', time()) == 7) {
              $dateBegin = strtotime("-2 weeks Monday");
              $dateEnd = strtotime("last Sunday");
              } else {
              $dateBegin = strtotime("Monday last week"); 
              $dateEnd = strtotime("Sunday last week");   
              }
              

              或者去年

              $dateBegin = strtotime("1/1 last year");
              $dateEnd = strtotime("12/31 this year");
              

              【讨论】:

                【解决方案9】:

                试试这个来得到这个月的天数:

                $numdays = date('t', mktime(0, 0, 0, $m, 1, $Y));
                

                【讨论】:

                  【解决方案10】:

                  示例;我想得到当月的第一天和最后一天。

                  $month   = (int) date('F');
                  $year    = (int) date('Y');
                  
                  date('Y-m-d', mktime(0, 0, 0, $month + 1, 1, $year)); //first
                  date('Y-m-d', mktime(0, 0, 0, $month + 2, 0, $year)); //last
                  

                  例如在日期 2015-01-09 运行此命令时,第一个和最后一个值将按顺序排列;

                  2015-01-01
                  2015-01-31
                  

                  经过测试。

                  【讨论】:

                    【解决方案11】:

                    来自标记为重复的here(get next month last day),因此我无法在此处添加评论,但人们可能会从那里得到不好的答案。

                    下个月最后一天更正一个:

                    echo ((new DateTime(date('Y-m').'-01'))->modify('+1 month')->format('Y-m-t'));
                    

                    下个月的第一天更正一个:

                    echo ((new DateTime(date('Y-m').'-01'))->modify('+1 month')->format('Y-m-01'));
                    

                    这样的代码将从 1 月开始在 3 月提供,所以这不是预期的。

                    echo ((new DateTime())-&gt;modify('+1 month')-&gt;format('Y-m-t'));

                    【讨论】:

                      【解决方案12】:

                      从现在开始建立相对日期的正确方法是:

                      //bad example - will be broken when generated at 30 of December (broken February)
                          echo date("Y-m-d", strtotime("now"))."\n";
                          echo date("Y-m-d", strtotime("now + 1 month"))."\n";
                          echo date("Y-m-d", strtotime("now + 2 month"))."\n";
                          echo date("Y-m-d", strtotime("now + 3 month"))."\n";
                          
                      //good example, you can change first day to last day or any day
                          echo date("Y-m-d", strtotime("first day of this month"))."\n";
                          echo date("Y-m-d", strtotime("first day of next month"))."\n";
                          echo date("Y-m-d", strtotime("first day of +2 month"))."\n";
                          echo date("Y-m-d", strtotime("first day of +3 month"))."\n";
                      

                      结果将是:

                      2021-12-30
                      2022-01-30
                      2022-03-02
                      2022-03-30
                      
                      2021-12-01
                      2022-01-01
                      2022-02-01
                      2022-03-01
                      

                      【讨论】:

                        猜你喜欢
                        • 2012-05-29
                        • 2013-06-23
                        • 2011-02-07
                        • 1970-01-01
                        • 2021-03-22
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多