Get week number in month from date in PHP?

前端 未结 14 2036
说谎
说谎 2020-11-28 11:15

I have an array of random dates (not coming from MySQL). I need to group them by the week as Week1, Week2, and so on upto Week5.

What I have is this:



        
相关标签:
14条回答
  • 2020-11-28 11:45
    function weekOfMonth($strDate) {
      $dateArray = explode("-", $strDate);
      $date = new DateTime();
      $date->setDate($dateArray[0], $dateArray[1], $dateArray[2]);
      return floor((date_format($date, 'j') - 1) / 7) + 1;  
    }
    

    weekOfMonth ('2015-09-17') // returns 3

    0 讨论(0)
  • 2020-11-28 11:45
    // self::DAYS_IN_WEEK = 7;
    function getWeeksNumberOfMonth(): int
    {
        $currentDate            = new \DateTime();
        $dayNumberInMonth       = (int) $currentDate->format('j');
        $dayNumberInWeek        = (int) $currentDate->format('N');
        $dayNumberToLastSunday  = $dayNumberInMonth - $dayNumberInWeek;
        $daysCountInFirstWeek   = $dayNumberToLastSunday % self::DAYS_IN_WEEK;
        $weeksCountToLastSunday = ($dayNumberToLastSunday - $daysCountInFirstWeek) / self::DAYS_IN_WEEK;
    
        $weeks = [];
        array_push($weeks, $daysCountInFirstWeek);
        for ($i = 0; $i < $weeksCountToLastSunday; $i++) {
            array_push($weeks, self::DAYS_IN_WEEK);
        }
        array_push($weeks, $dayNumberInWeek);
    
        if (array_sum($weeks) !== $dayNumberInMonth) {
            throw new Exception('Logic is not valid');
        }
    
        return count($weeks);
    }
    

    Short variant:

    (int) (new \DateTime())->format('W') - (int) (new \DateTime('first day of this month'))->format('W') + 1;
    
    0 讨论(0)
  • 2020-11-28 11:45
    $date = new DateTime('first Monday of this month');
    $thisMonth = $date->format('m');
    $mondays_arr = [];
    
    // Get all the Mondays in the current month and store in array
    while ($date->format('m') === $thisMonth) {
        //echo $date->format('Y-m-d'), "\n";
        $mondays_arr[] = $date->format('d');
        $date->modify('next Monday');
    }
    
    // Get the day of the week (1-7 from monday to sunday)
    $day_of_week = date('N') - 1;
    
    // Get the day of month (1 to 31) 
    $current_week_monday_date = date('j') - $day_of_week;
    
    /*$day_of_week = date('N',mktime(0, 0, 0, 2, 11, 2020)) - 1;
    $current_week_monday_date = date('j',mktime(0, 0, 0, 2, 11, 2020)) - $day_of_week;*/
    
    $week_no = array_search($current_week_monday_date,$mondays_arr) + 1;
    echo "Week No: ". $week_no;
    
    0 讨论(0)
  • 2020-11-28 11:46

    My function. The main idea: we would count amount of weeks passed from the month's first date to current. And the current week number would be the next one. Works on rule: "Week starts from monday" (for sunday-based type we need to transform the increasing algorithm)

    function GetWeekNumberOfMonth ($date){
        echo $date -> format('d.m.Y');
        //define current year, month and day in numeric
        $_year = $date -> format('Y');
        $_month = $date -> format('n');
        $_day = $date -> format('j');
        $_week = 0; //count of weeks passed
        for ($i = 1; $i < $_day; $i++){
            echo "\n\n-->";
            $_newDate = mktime(0,0,1, $_month, $i, $_year);
            echo "\n";
            echo date("d.m.Y", $_newDate);
            echo "-->";
            echo date("N", $_newDate);
            //on sunday increasing weeks passed count
            if (date("N", $_newDate) == 7){
                echo "New week";
                $_week += 1;
            }
    
        }
        return $_week + 1; // as we are counting only passed weeks the current one would be on one higher
    }
    
    $date = new DateTime("2019-04-08");
    echo "\n\nResult: ". GetWeekNumberOfMonth($date);
    
    0 讨论(0)
  • 2020-11-28 11:46

    I know this an old post but i have an idea!

    $datetime0 = date_create("1970-01-01");
    $datetime1 = date_create(date("Y-m-d",mktime(0,0,0,$m,"01",$Y)));
    $datetime2 = date_create(date("Y-m-d",mktime(0,0,0,$m,$d,$Y)));
    
    $interval1 = date_diff($datetime0, $datetime1);
    $daysdiff1= $interval1->format('%a');
    
    $interval2 = date_diff($datetime0, $datetime2);
    $daysdiff2= $interval2->format('%a');
    
    $week1=round($daysdiff1/7);
    $week2=round($daysdiff2/7);
    
    $WeekOfMonth=$week2-$week1+1;
    
    0 讨论(0)
  • 2020-11-28 11:50

    There is a many solutions but here is one my solution that working well in the most cases.

    function current_week ($date = NULL) {
        if($date) {
            if(is_numeric($date) && ctype_digit($date) && strtotime(date('Y-m-d H:i:s',$date)) === (int)$date)
                $unix_timestamp = $date;
            else
                $unix_timestamp = strtotime($date);
        } else $unix_timestamp = time();
    
        return (ceil((date('d', $unix_timestamp) - date('w', $unix_timestamp) - 1) / 7) + 1);
    }
    

    It accept unix timestamp, normal date or return current week from the time() if you not pass any value.

    Enjoy!

    0 讨论(0)
提交回复
热议问题