【问题标题】:Calculate the weeks between 2 dates manually in PHP在 PHP 中手动计算 2 个日期之间的周数
【发布时间】:2021-11-24 17:33:56
【问题描述】:

我正在尝试计算自特定日期以来的月数和周数,而不是从年初开始。

它不应遵循日历月,而应将一个月视为每 4 周,并从指定日期开始。我需要能够显示月数,以及星期几(1、2、3 或 4)。

我想输入一个开始日期,然后让它计算从该开始日期开始的月份和星期几,例如,如果开始日期设置为 8 月 1 日星期一,它应该显示第 1 个月、第 1 周等等。

我的代码如下。我用一些不同的开始日期对其进行了测试。下面列出了以下代码生成的内容以及它应该显示的内容

6 月 20 日:应该是第 2 周 - 显示为第 0 周

6 月 27 日:应该是第 1 周 - 显示为第 3 周

7 月 4 日:应该是第 4 周 - 显示为第 2 周

7 月 11 日:应该是第 3 周 - 显示为第 1 周

7 月 18 日:应该是第 2 周 - 显示为第 0 周

$monthNumber          = 5;
$monthStartDate       = '2016-06-13';
$currentStartWeekDate = date('l') != 'Monday' ? date("Y-m-d", strtotime("last monday")) : date("Y-m-d"); // get the current week's Monday's date

$weekDateCounter      = $monthStartDate;
$currentWeekNumber    = 0;

while ($weekDateCounter != $currentStartWeekDate){
  $currentWeekNumber += 1;
  $weekDateCounter    = date("Y-m-d", strtotime($weekDateCounter . "+7 days"));
  
  //
  if ($currentWeekNumber == 4){
    $currentWeekNumber  = 0; // reset week number
    $monthNumber       += 1; // increment month number
  }
}

我真的很茫然,可以使用任何帮助!

【问题讨论】:

    标签: php


    【解决方案1】:

    您的方法似乎过于复杂:

    function weekCounter($startDate,$endDate=null){
    
        //use today as endDate if no date was supplied
        $endDate = $endDate? : date('Y-m-d');
    
        //calculate # of full weeks between dates
        $secsPerWeek = 60 * 60 * 24 * 7;
        $fullWeeks = 
                floor((strtotime($endDate) - strtotime($startDate))/$secsPerWeek);
    
        $fullMonths = floor($fullWeeks/4);
        $weeksRemainder = $fullWeeks % 4; // weeks that don't fit in a month
    
        //increment from 0-base to 1-base, so first week is Week 1. Same with months
        $fullMonths++; $weeksRemainder++;
    
        //return months and weeks in an array
        return [$fullMonths,$weeksRemainder];
    }
    

    您可以通过这种方式调用该函数,并捕获月份和周数:

    //list() will assign the array members from weekCounter to the vars in list
    list($months,$weeks) = weekCounter('2016-06-07'); //no end date, so today is used
    
    //now $months and $weeks can be used as you wish
    echo "Month: $months, Week: $weeks"; //outputs Month: 2, Week: 2
    

    Live demo

    【讨论】:

    • 这太棒了,谢谢!抱歉,我意识到我在最初的问题中并没有那么清楚。我想返回一个像你的例子一样的结果,但是我希望它每周自动更新。
    • @superhappybunnycat 这将自动更新。它是一个函数,因此您只需向它提供您想要的开始日期和结束日期,它就会为您提供正确的结果。如果调用不同周的函数,结果会自动更新。查看我链接的现场演示
    • 它似乎无法正常工作 :( 它与我的代码相似,因为它不应该包含第 0 周,并且不显示第 4 周 Months: 1, Weeks: 0 月:1,周:1 月:1,周:2 月:1,周:3 另外,我曾希望输入开始日期,然后将其放在我的网站上并离开它并自动更新周数(没有必须继续输入结束日期)
    • 如果endDate 始终相同,则修改函数使其仅采用startDate。在函数内部,您可以将endDate 变量设置为您想要的任何固定值。至于意外的结果,请给我两个具体的日期,该功能不起作用,以及您期望得到的结果
    • 例如,如果我输入 8 月 1 日星期一的开始日期和 8 月 28 日星期日的结束日期,我希望看到第 1 周。目前,当您输入时它显示第 3 周在。具有相同的开始和结束日期,我希望它会根据日历中的日期显示下一周:当它是 8 月 8 日星期一时 - 更新到第 2 周 当它是 8 月 15 日星期一时 - 更新到第 3 周时现在是 8 月 22 日星期一 - 更新到第 4 周
    【解决方案2】:

    DateTime 类可以让你更简单。他们的文档在这里:http://php.net/manual/en/book.datetime.php

    试试这个:

    $date1 = new DateTime('2016-04-01');
    $date2 = new DateTime('2016-07-24');
    
    $diff = $date1->diff($date2);
    
    $daysInbetween = $diff->days;
    $weeksInbetween = floor($diff->days / 7);
    $monthsInbetween = floor($weeksInbetween / 4);
    
    print "Days inbetween = $daysInbetween" . PHP_EOL;
    print "Weeks inbetween = $weeksInbetween" . PHP_EOL;
    print "Months inbetween = $monthsInbetween" . PHP_EOL;
    
    print "Total difference = $monthsInbetween months and "
        . ($weeksInbetween - ($monthsInbetween * 4)) . " weeks" . PHP_EOL;
    

    【讨论】:

    • 道歉我意识到我在最初的问题中并没有那么清楚。我想返回一个像你的例子一样的结果,但是我希望它每周自动更新。
    【解决方案3】:
    <?php
        /**
         * AUTHOR : VEDAVITH RAVULA
         * DATE : 13122019
         */
         function get_weeks($startDate = NULL,$endDate = NULL)
        {
                if(is_null($startDate) && is_null($endDate))
                {
                    $startDate = date('Y-m-01');
                    $endDate = date('Y-m-t');
                } 
    
                    $date1 = new DateTime($startDate);
                    $date2 = new DateTime($endDate);
    
                    $interval = $date1->diff($date2);
                    $weeks = floor(($interval->days) / 7);
    
                    if(($date1->format("N") > 1) && ($date1->format("D") != "Sun"))
                    {
                       $diffrence = "-".( $date1->format("N"))." Days";
                       $date1 = $date1->modify($diffrence);
                    }
                        for($i = 0; $i <= $weeks; $i++)
                        {   
                            if($i == 0)
                            {
                                $start_date = $date1->format('Y-m-d');
                                $date1->add(new DateInterval('P6D'));
    
                            }
                            else
                            {
                                $date1->add(new DateInterval('P6D'));
                            }
                            echo $start_date." - ".$date1->format('Y-m-d')."\n";
                            $date1->add(new DateInterval('P1D'));
                            $start_date = $date1->format('Y-m-d');
                        }
    
            
        }
    
        //function call
    get_weeks("2021-11-01", "2021-11-14");
    

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多