2015-09-16 15 views
8

Ich habe ein Array von zufälligen Daten (nicht von MySQL). Ich muss sie nach Woche als Woche 1, Woche 2 usw. bis Woche 5 gruppieren.Erhalten Woche Woche in Monat von Datum in PHP?

Was ich habe, ist dies:

$dates = array('2015-09-01','2015-09-05','2015-09-06','2015-09-15','2015-09-17'); 

Was ich brauche, ist eine Funktion, indem Sie das Datum, die Nummer der Woche des Monats zu erhalten.

Ich weiß, dass ich die Wochennummer bekommen kann von date('W',strtotime('2015-09-01')); zu tun, aber diese Woche Zahl ist die Zahl zwischen Jahr (1-52), aber ich brauche die Nummer der Woche des Monats nur, z.B. im September 2015 gibt es 5 Wochen:

  • Week1 = 1. bis 5.
  • Woche2 = 6. bis 12.
  • Woche3 = 13. bis 19.
  • week4 = 20. bis 26.
  • Week5 = 27. bis 30.

Ich sollte in der Lage sein, die Woche Week1 nur mit dem Datum z

$weekNumber = getWeekNumber('2015-09-01') //output 1; 
$weekNumber = getWeekNumber('2015-09-17') //output 3; 
+0

Bitte klären Sie Ihre Frage. –

Antwort

12

Ich denke, diese Beziehung wahr sein sollte, und kommen in praktisch (?):

Week of the month = Week of the year - Week of the year of first day of month + 1 

in PHP implementiert Sie diese:

function weekOfMonth($date) { 
    //Get the first day of the month. 
    $firstOfMonth = strtotime(date("Y-m-01", $date)); 
    //Apply above formula. 
    return intval(date("W", $date)) - intval(date("W", $firstOfMonth)) + 1; 
} 

Um Wochen zu bekommen, die beginnen w Ersetzen Sie am Sonntag einfach beide date("W", ...) durch strftime("%U", ...).

7

Sie können die Funktion unten verwenden, vollständig kommentierte:

/** 
* Returns the number of week in a month for the specified date. 
* 
* @param string $date 
* @return int 
*/ 
function weekOfMonth($date) { 
    // estract date parts 
    list($y, $m, $d) = explode('-', date('Y-m-d', strtotime($date))); 

    // current week, min 1 
    $w = 1; 

    // for each day since the start of the month 
    for ($i = 1; $i <= $d; ++$i) { 
     // if that day was a sunday and is not the first day of month 
     if ($i > 1 && date('w', strtotime("$y-$m-$i")) == 0) { 
      // increment current week 
      ++$w; 
     } 
    } 

    // now return 
    return $w; 
} 
+0

das gibt auch nicht das richtige Ergebnis .. '2015-09-06' sollte die zweite Woche nicht zuerst sein. –

+0

Siehe meine Bearbeitung, sollte jetzt funktionieren. –

2

ich diese Funktion auf meinem eigenen erstellt haben, die korrekt zu funktionieren scheint. Falls jemand anders eine bessere Möglichkeit hat, dies zu tun, bitte teilen .. Hier ist was ich getan habe.

function weekOfMonth($qDate) { 
    $dt = strtotime($qDate); 
    $day = date('j',$dt); 
    $month = date('m',$dt); 
    $year = date('Y',$dt); 
    $totalDays = date('t',$dt); 
    $weekCnt = 1; 
    $retWeek = 0; 
    for($i=1;$i<=$totalDays;$i++) { 
     $curDay = date("N", mktime(0,0,0,$month,$i,$year)); 
     if($curDay==7) { 
      if($i==$day) { 
       $retWeek = $weekCnt+1; 
      } 
      $weekCnt++; 
     } else { 
      if($i==$day) { 
       $retWeek = $weekCnt; 
      } 
     } 
    } 
    return $retWeek; 
} 


echo weekOfMonth('2015-09-08') // gives me 2; 
+0

Können Sie bitte erklären, warum '$ weekCnt' mit 1 initialisiert wird? – vidhi

+0

Wenn ich 'echo weekOfMonth ('2017-10-01') schreibe:' Es gibt 2. Ich denke, es sollte 1. – vidhi

3

Der corect Weg ist

function weekOfMonth($date) { 
    $firstOfMonth = date("Y-m-01", strtotime($date)); 
    return intval(date("W", strtotime($date))) - intval(date("W", strtotime($firstOfMonth))); 
} 
1

die Time_t wday (0 = Sonntag bis 6 = Samstag) der ersten des Monats, in firstWday In Anbetracht dieser gibt die (Sonntag-basierte) Wochennummer innerhalb des Monats :

weekOfMonth = floor((dayOfMonth + firstWday - 1)/7) + 1 

in PHP Übersetzt:

function weekOfMonth($dateString) { 
    list($year, $month, $mday) = explode("-", $dateString); 
    $firstWday = date("w",strtotime("$year-$month-1")); 
    return floor(($mday + $firstWday - 1)/7) + 1; 
} 
2
function getWeekOfMonth(DateTime $date) { 
    $firstDayOfMonth = new DateTime($date->format('Y-m-1')); 

    return ceil(($firstDayOfMonth->format('N') + $date->format('j') - 1)/7); 
} 

Goendg solution funktioniert nicht für 2016-10-31.

-1
//It's easy, no need to use php function 
//Let's say your date is 2017-07-02 

$Date = explode("-","2017-07-02"); 
$DateNo = $Date[2]; 
$WeekNo = $DateNo/7; // devide it with 7 
if(is_float($WeekNo) == true) 
{ 
    $WeekNo = ceil($WeekNo); //So answer will be 1 
} 

//If value is not float then ,you got your answer directly 
+0

Dies gibt nur das richtige Ergebnis, wenn der erste Tag des Monats ein Montag ist. – Anders

Verwandte Themen