【问题标题】:How to find first day of the next month and remaining days till this date with PHP如何使用PHP查找下个月的第一天和直到该日期的剩余天数
【发布时间】:2009-11-22 00:59:48
【问题描述】:

我怎样才能找到下个月的第一天以及从今天到今天的剩余天数?

谢谢

【问题讨论】:

    标签: php


    【解决方案1】:

    为下个月的第一天 00:00 创建一个时间戳:

    $firstDayNextMonth = strtotime('first day of next month');
    

    距离该日期的天数是从现在到那时的秒数除以 (24 * 60 * 60)。

    $daysTilNextMonth = ($firstDayNextMonth - time()) / (24 * 3600);
    

    【讨论】:

    • 当我尝试这个时,我得到了 29.895185185185
    • 这在 12 月是错误的。它将生成一个时间,即明年第 0 个月的第 0 天(逻辑上是当年 11 月的最后一天)。应该是$startDateRange = mktime(0, 0, 0, 1, 1, $curYear+1);
    【解决方案2】:

    获取本月最后一天的最简单方法

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

    【讨论】:

      【解决方案3】:
      $firstDayNextMonth = date('Y-m-d', strtotime('first day of next month'));
      

      从当前开始两个月后的第一天

      $firstDayAfterTwoMonths = date('Y-m-d', strtotime('first day of +2 month'));
      

      【讨论】:

      • 也适用于以下月份:strtotime('first day of +2 month')
      【解决方案4】:

      您可以像这样使用 DateTime 对象来找出下个月的第一天,如下所示:

      $date = new DateTime('first day of next month');
      

      您可以这样做来知道从现在到下个月的第一天还有多少天:

      $date = new DateTime('now');
      $nowTimestamp = $date->getTimestamp();
      $date->modify('first day of next month');
      $firstDayOfNextMonthTimestamp = $date->getTimestamp();
      echo ($firstDayOfNextMonthTimestamp - $nowTimestamp) / 86400;
      

      【讨论】:

      • 这应该是答案。 +1
      【解决方案5】:

      您可以使用 php date 方法查找当前月份和日期,然后您需要有一个简短的列表来查找该月有多少天并减去(闰年需要额外的工作)。

      【讨论】:

      • 您对这篇文章没有做任何事情,只是解释了实现目标的难度。下次,请提供更多帮助或根本不发帖。
      【解决方案6】:

      最简单快捷的方法是使用 strtotime() 识别“下个月第一天”;

      $firstDayNextMonth = date('Y-m-d', strtotime('first day next month'));
      

      【讨论】:

      • 这在某些情况下可能会中断,例如今天尝试这个(2012-11-30)结果为2012-12-31。像这样实现它可能更安全:$firstDayNextMonth = date('Y-m-01', strtotime('next month'));
      • @Bjoern 好吧,当你写 'first day next month' 时就会发生这种情况。应该是'first day of next month',一切都会按预期进行。
      • 也适用于以下月份:strtotime('first day of +2 month')
      【解决方案7】:

      自从我用谷歌搜索了这个并得出了这个答案,我想我会包含一个适用于 PHP 5.3.0+ 的更现代的答案。

      //Your starting date as DateTime
      $currentDate = new DateTime(date('Y-m-d'));
      
      //Add 1 month
      $currentDate->add(new DateInterval('P1M'));
      
      //Get the first day of the next month as string
      $firstDayOfNextMonth = $currentDate->format('Y-m-1');
      

      【讨论】:

      • 这是不正确的!如果此代码在 2021-01-30 运行,结果将错误地为 2021-03-01。正确的是 2021-02-01。这无法解释具有不同长度的月份。
      【解决方案8】:

      您可以通过以下方式获得下个月的第一天:

      $now = getdate();
      $nextmonth = ($now['mon'] + 1) % 13 + 1;
      $year = $now['year'];
      if($nextmonth == 1)
          $year++;
      $thefirst = gmmktime(0, 0, 0, $nextmonth, $year);
      

      在此示例中,$thefirst 将是下个月第一天的 UNIX 时间戳。使用date 将其格式化为您喜欢的格式。

      这将为您提供该月的剩余天数:

      $now = getdate();
      $months = array(
          31,
          28 + ($now['year'] % 4 == 0 ? 1 : 0), // Support for leap years!
          31,
          30,
          31,
          30,
          31,
          31,
          30,
          31,
          30,
          31
      );
      $days = $months[$now['mon'] - 1];
      $daysleft = $days - $now['mday'];
      

      剩余天数将存储在$daysleft

      希望这会有所帮助!

      【讨论】:

        【解决方案9】:

        $firstDayNextMonth = date('Y-m-d', mktime(0, 0, 0, date('m')+1, 1, date('Y')));

        【讨论】:

          【解决方案10】:

          正如另一位发帖人所提到的,当您使用 2016 年 1 月 31 日或 2016 年 8 月 31 日等日期时,DateInterval 对象不会给出下个月的准确结果,因为它会跳过下个月。我的解决方案是仍然使用 DateInterval 对象,但在使用 DateInterval 之前将当前日期重新格式化为当月的第一天。

          $currentDate = '8/31/2016';
          $date = new DateTime(date("n", strtotime($currentDate))."/1/".date("Y", strtotime($currentDate)));
          //add 1 month
          $date->add(new DateInterval('P1M'));
          $currentDate=$date->format('m/1/Y'); 
          
          echo($currentDate);
          

          【讨论】:

            【解决方案11】:

            我采用了 mattbasta 的方法,因为它能够获得具有给定日期的“下个月的第一天”,但是在计算 $nextmonth 时存在一个小问题。修复方法如下:

            $now = getdate();
            $nextmonth = ($now['mon'] + 1) % 13 + 1;
            $year = $now['year'];
            if($nextmonth == 1)
                $year++;
            else
                $nextmonth--;
            $thefirst = gmmktime(0, 0, 0, $nextmonth, $year);
            

            【讨论】:

              【解决方案12】:

              我最初考虑使用 DateInterval 对象(如上文在另一个答案中所讨论的),但它不可靠。例如,如果当前 DateTime 是 1 月 31 日,然后我们添加一个月(以获得下个月),那么它将完全跳过 2 月!

              这是我的解决方案:

              function start_of_next_month(DateTime $datetime)
              {
                  $year = (int) $datetime->format('Y');
                  $month = (int) $datetime->format('n');
                  $month += 1;
              
                  if ($month === 13)
                  {
                      $month = 1;
                      $year += 1;
                  }
              
                  return new DateTime($year . '-' . $month . '-01');
              }
              

              【讨论】:

                【解决方案13】:

                获取下个月第一天和最后一天的更简单方法

                $first = strttotime("first day of next month");
                $last = strttotime("last day of next month");
                

                【讨论】:

                • 请详细说明您的答案。仅发布一段代码是不够的。您可以在此处阅读有关高质量答案的更多信息:stackoverflow.com/help/how-to-answer
                • 请解释您的答案,以便您的代码更容易理解
                【解决方案14】:

                你可以做这样的事情。要拥有此功能,您需要使用https://packagist.org/packages/ishworkh/navigable-date 中提供的 php 库。

                这样就可以很容易地完成您在这里的要求。 例如:

                $format = 'Y-m-d H:i:s';
                
                $Date = \NavigableDate\NavigableDateFacade::create('2017-02-24');
                var_dump($Date->format($format));
                
                $resetTime = true;
                $resetDays = true;
                
                $NextMonth = $Date->nextMonth($resetTime, $resetDays);
                
                var_dump($NextMonth->format($format));
                
                $DayUntilFirstOfNextMonth = $NextMonth->getDifference($Date);
                
                var_dump('Days left:' . $DayUntilFirstOfNextMonth->format('%d'));
                

                给你输出:

                string(19) "2017-02-24 00:00:00"
                string(19) "2017-03-01 00:00:00"
                string(11) "Days left:5"
                

                注意:此外,此库允许您按天、周、年向前或向后导航日期。有关更多信息,请查看其 README。

                【讨论】:

                  【解决方案15】:

                  (PHP 5 >= 5.5.0, PHP 7, PHP 8)

                  为了得到下个月的第一天一个干净的解决方案:

                  <?php
                  $date = new DateTimeInmutable('now');
                  $date->modify('first day of next month');//here the magic occurs
                  
                  echo $date->format('Y-m-d') . '\n';
                  
                  

                  由于您只想计算它,我建议使用DateTimeInmutable 类。 使用 DateTime$date-&gt;modify('first day of next month'); 类将修改您的原始日期值。

                  【讨论】:

                  • 你有一些错误。类名是 DateTimeImmutable 而不是 DateTimeInmutable。此外,它是不可变的,这意味着您需要将修改分配给第二个变量,因为原始的 $date 变量不会被更改。
                  【解决方案16】:
                  $month = date('m')+1;
                  if ($month<10) {
                      $month = '0'.$month;
                  }
                  echo date('Y-').$month.'-01';
                  

                  实现这一目标的最简单方法。您可以回显或存储到变量中。

                  【讨论】:

                  • 如果在 2021-01-30 运行,这将返回不正确的结果。
                  【解决方案17】:

                  12 年后,在阅读了答案后,我想出了这个来满足我的需要:

                  if(date('m') == 12) { $next_month = 1; } else { $next_month = date('m')+1; }
                  if($next_month == 1) { $year_start = date('Y')+1; } else { $year_start = date('Y'); }
                  $date_start_of_next_month = $year_start . '-' . $next_month . '-01 00:00:00';
                  
                  if($next_month == 12) { $month_after = 1; } else { $month_after = $next_month+1; }
                  if($month_after == 1) { $year_end = date('Y')+1; } else { $year_end = date('Y'); }
                  $date_start_of_month_after_next = $year_end . '-' . $month_after . '-01 00:00:00';
                  

                  请注意,我没有选择$date_end_of_next_month,而是选择了$date_start_of_month_after_next 日期,它避免了闰年和包含不同天数的月份的麻烦。 您可以简单地使用&gt;= 比较符号$date_start_of_next_month&lt; 一个$date_start_of_month_after_next

                  如果您更喜欢日期的时间戳格式,那么您需要在这两个变量上应用 PHP 的 strtotime() 本机函数。

                  希望现在帮助您满足需求还为时不晚。 #开玩笑

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-11-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-09-26
                    相关资源
                    最近更新 更多