2016-05-14 26 views
5

Voglio dividere il mese corrente in settimane come primo giorno a sabato e poi domenica a sabato successivo. Per esempio: per mese di maggio, quindi voglio dividere quello comeDividere il mese corrente in settimane in php

2016-05-01 to 2016-05-07 
2016-05-08 to 2016-05-14 
2016-05-15 to 2016-05-21 
2016-05-22 to 2016-05-28 
2016-05-29 to 2016-05-31 

se provo il codice seguente, non ho ottenuto il risultato esatto.

<?php 

$start_date = date('Y-m-d', strtotime('2016-06-01')); 
$end_date = date('Y-m-d', strtotime('2016-06-30')); 
$i=1; 
for($date = $start_date; $date <= $end_date; $date = date('Y-m-d',  strtotime($date. ' + 7 days'))) { 
    echo getWeekDates($date, $start_date, $end_date, $i); 
    echo "\n"; 
    $i++; 
} 

function getWeekDates($date, $start_date, $end_date, $i) { 
    $week = date('W', strtotime($date)); 
    $year = date('Y', strtotime($date)); 

    $from = date("Y-m-d", strtotime("{$year}-W{$week}+1")); 
    if($from < $start_date) $from = $start_date; 

    $to = date("Y-m-d", strtotime("{$year}-W{$week}-7")); 
    if($to > $end_date) $to = $end_date; 

    echo $from." - ".$to.'<br>';  
} 

?> 

ho avuto come

2016-05-01 - 2016-05-01 
2016-05-01 - 2016-05-08 
2016-05-08 - 2016-05-15 
2016-05-15 - 2016-05-22 
2016-05-22 - 2016-05-29 

Nel ciclo for, durante il controllo ultimo set di giorni, conditon ottenere fallito .so che pretende molto calcolare 30,31.

Come posso farlo?

+0

potrebbe essere questo è il problema W - The I Numero di settimane SO-8601 dell'anno (settimane che iniziano il lunedì) – JYoThI

risposta

1

DateTime, DatePeriod e DateInterval sono i tuoi amici per farlo in fretta!

See online.

<?php 
/** 
* @file 
* Awnser to http://stackoverflow.com/q/37224961/392725 
* 
* @link http://stackoverflow.com/a/37228497/392725 
*/ 
date_default_timezone_set('Europe/Paris'); 

function getWeekDates(DateTimeInterface $date, $format = 'Y-m-d') { 
    $dt  = \DateTimeImmutable::createFromMutable($date); 
    $first_day = $dt->modify('first day of this month'); 
    $last_day = $dt->modify('last day of this month'); 
    $period = new \DatePeriod(
    $first_day, 
    \DateInterval::createFromDateString('sunday this week'), 
    $last_day, 
    \DatePeriod::EXCLUDE_START_DATE 
); 

    $weeks = [$first_day->format($format)]; 
    foreach ($period as $d) { 
    $weeks[] = $d->modify('-1 day')->format($format); 
    $weeks[] = $d->format($format); 
    } 
    $weeks[] = $last_day->format($format); 

    return array_chunk($weeks, 2); 
} 

echo "Weeks of the current month:\n"; 
$weeks = getWeekDates(new \DateTime('now')); 
array_walk($weeks, function ($week) { 
    vprintf("%s to %s\n", $week); 
}); 

echo "\nWeeks of the month may 2016:\n"; 
$weeks = getWeekDates(new \DateTime('2016-05')); 
array_walk($weeks, function ($week) { 
    vprintf("%s to %s\n", $week); 
}); 

echo "\nWeeks of the month june 2016:\n"; 
$weeks = getWeekDates(new \DateTime('2016-06')); 
array_walk($weeks, function ($week) { 
    vprintf("%s to %s\n", $week); 
}); 

echo "\nWeeks of the month october 2016:\n"; 
$weeks = getWeekDates(new \DateTime('2016-10')); 
array_walk($weeks, function ($week) { 
    vprintf("%s to %s\n", $week); 
}); 

Risultato:

Weeks of the current month: 
2016-05-01 to 2016-05-07 
2016-05-08 to 2016-05-14 
2016-05-15 to 2016-05-21 
2016-05-22 to 2016-05-28 
2016-05-29 to 2016-05-31 

Weeks of the month may 2016: 
2016-05-01 to 2016-05-07 
2016-05-08 to 2016-05-14 
2016-05-15 to 2016-05-21 
2016-05-22 to 2016-05-28 
2016-05-29 to 2016-05-31 

Weeks of the month june 2016: 
2016-06-01 to 2016-06-04 
2016-06-05 to 2016-06-11 
2016-06-12 to 2016-06-18 
2016-06-19 to 2016-06-25 
2016-06-26 to 2016-06-30 

Weeks of the month october 2016: 
2016-10-01 to 2016-10-01 
2016-10-02 to 2016-10-08 
2016-10-09 to 2016-10-15 
2016-10-16 to 2016-10-22 
2016-10-23 to 2016-10-29 
2016-10-30 to 2016-10-31 
2

Provare così, presumo che sia possibile modificare la variabile del mese in base alle proprie esigenze.

$month=5;//pass here your month 
$first_date = date("Y-m-1"); 
do{ 
    $last_date = date("Y-m-d",strtotime($first_date. " +6 days")); 
    $month = date("m",strtotime($last_date)); 
    if($month!=5) 
    $last_date = date("Y-m-t"); 

    echo "<br>".$first_date." - ".$last_date; 
    $first_date = date("Y-m-d",strtotime($last_date. " +1 days")); 
}while($month == 5); 

Controllare qui: https://eval.in/571521

0
function getSaturdays($y, $m) 
{ 
    return new DatePeriod(
     new DateTime("first saturday of $y-$m"), 
     DateInterval::createFromDateString('next saturday'), 
     new DateTime("last day of $y-$m") 
    ); 
} 


function list_week_days($year, $month) { 
    $first_month_day = new DateTime("first day of $year-$month") ; 
    echo $first_month_day->format("Y-m-d\n") . '-'; 
    foreach (getSaturdays($year, $month) as $saturday) { 
     echo $saturday->format(" Y-m-d\n"); 
     echo '-<br>'; 
     $sunday = $saturday->modify('next Sunday'); 
     echo $sunday->format(" Y-m-d\n"); 

    } 
    $last_month_day = new DateTime("last day of $year-$month"); 
    echo $last_month_day->format("Y-m-d\n"); 
} 


list_week_days(2016, 5); 

P.S. Ti incoraggio a utilizzare la classe DateTime

0

Modificato il codice di Rishi, fissato alcuni punti problematici e ha risolto il problema di anni bisestili quando spacca febbraio in settimane:

$weeks = monthToWeeks(2016, '02'); 

print_r($weeks); 

function monthToWeeks($y, $m) 
{ 
    $weeks = []; 
    $month = $m; 
    $first_date = date("{$y}-{$m}-01"); 

    do { 
     $last_date = date("Y-m-d", strtotime($first_date. " +6 days")); 
     $month = date("m", strtotime($last_date)); 

     if ($month != $m) { 
      $last_date = date("Y-m-t", mktime(0, 0, 0, $m, 1, $y)); 

      if ($first_date > $last_date) { 
       break; 
      } 
     } 

     $weeks[] = [$first_date, $last_date]; 

     $first_date = date("Y-m-d", strtotime($last_date. " +1 days")); 

    } while($month == intval($m)); 

    return $weeks;  
} 

Si può provare qui https://eval.in/643724