2011-08-15 140 views
11

例如: $startDate是星期一2007-02-05和$endDate星期二2007-02-20。然後我希望它列出:php函數獲取日期範圍內的所有星期一

Monday 2007-02-05 
Monday 2007-02-12 
Monday 2007-02-19 

我看了一下PHP手冊,發現這樣可以獲得兩個日期之間的所有日子。但如何以我想要的方式做到這一點? PHP代碼:

+4

「PHP代碼:」之後的代碼在哪裏? –

回答

3
for ($i = strtotime($startDate); $i <= strtotime($endDate); $i = strtotime('+1 day', $i)) { 
    if (date('N', $i) == 1) //Monday == 1 
    echo date('l Y-m-d', $i); //prints the date only if it's a Monday 
} 
0

轉換$的startDate和$結束日期之前到時間戳:

foreach ($date = $start; $date <= $end; $date += 60 * 60 * 24) 
{ 
    if (strftime('%w', $date) == 1) 
    { 
     $mondays[] = strftime('%A %Y-%m-%d', $date); 
    } 
} 
30

而不是讓所有的日子,並通過他們的所有循環,開始日期後獲得的第一個星期一,然後遍歷每次7天:

$endDate = strtotime($endDate); 
for($i = strtotime('Monday', strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i)) 
    echo date('l Y-m-d', $i); 
+3

您應該使用strtotime(「+ 1周」,$ i)而不是添加魔術數字604800,否則將是夏令時的麻煩。 – realmfoo

+3

如果是星期一,您將跳過$ endDate。 – realmfoo

+2

最後一件事:「strtotime($ endDate)」將在每一步計算,最好引入一個新變量並將其放入第一部分:for($ i = ..,$ n = strtotime() ; $ i <= $ n; ...) – realmfoo

1

這是獲取「$ startdate」的工作日並計算兩個日期之間的工作日數的代碼。

 

`$startdate` = '2015-03-01'; 
`$endate` = '2015-03-31'; 
`$recurringDay` = date('N', strtotime($startdate)); // recurring Day from date i.e monday = 1, Tuesday = 2 ...etc 
$begin = new DateTime(`$startdate`); 
    $end = new DateTime(date('Y-m-d',strtotime('+1 day', strtotime($endate)))); 
    while($begin format('Y-m-d'); 
     $day[] = $begin->format('N'); 
     $begin->modify('+1 day'); 
    } 
    $c=0; // counter starts 

    foreach($day as $key=>$dt) { 

    if ($dt==`$recurringDay`) // compare it 
    { 
     $k[] = $key; 
     $c++; 
    } 
    } 

    `$nofDays` = $c; // number of mondays , tuesday 

    foreach($k as $pp) { 
     //adding session code 
     `$recurringDatetime[]` = $period[$pp]; // recurring dates 
     } 

     print_r(`$recurringDatetime`); // array of dates of monday, tuesday ..etc 
+0

這是獲取「$ startdate」平日的代碼,兩個日期之間存在週日數。 – user3513751

6

您可以使用下面的函數來獲取特定日期的日期範圍之間的日期數組。

您必須輸入開始日期,結束日期和日期編號。日期編號如下。 1 =週一,2 =週二,3 =週三,4 =週四。 5 =週五,6 =週六,7 =週日。

function getDateForSpecificDayBetweenDates($startDate,$endDate,$day_number){ 
$endDate = strtotime($endDate); 
$days=array('1'=>'Monday','2' => 'Tuesday','3' => 'Wednesday','4'=>'Thursday','5' =>'Friday','6' => 'Saturday','7'=>'Sunday'); 
for($i = strtotime($days[$day_number], strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i)) 
$date_array[]=date('Y-m-d',$i); 

return $date_array; 
} 
+1

就像一個魅力 – Robouste

4

我需要相同的,並創建了一個簡單的方法。

public function getMondaysInRange($dateFromString, $dateToString) 
{ 
    $dateFrom = new \DateTime($dateFromString); 
    $dateTo = new \DateTime($dateToString); 
    $dates = []; 

    if ($dateFrom > $dateTo) { 
     return $dates; 
    } 

    if (1 != $dateFrom->format('N')) { 
     $dateFrom->modify('next monday'); 
    } 

    while ($dateFrom <= $dateTo) { 
     $dates[] = $dateFrom->format('Y-m-d'); 
     $dateFrom->modify('+1 week'); 
    } 

    return $dates; 
} 

然後使用它。

$dateFromString = '2007-02-05'; 
$dateToString = '2007-02-20'; 
var_dump($this->getMondaysInRange($dateFromString, $dateToString)); 

結果:

array (size=3) 
    0 => string '2007-02-05' (length=10) 
    1 => string '2007-02-12' (length=10) 
    2 => string '2007-02-19' (length=10) 

也許這將是對某人有幫助。

1

我創建了一個類,你得到所有天在範圍日期按天分組的名稱:

class DayHelper{ 

     const MONDAY = 'Mon'; 
     const TUESDAY = 'Tue'; 
     const WEDENSDAY = 'Wed'; 
     const THURSDAY = 'Thu'; 
     const FRIDAY = 'Fri'; 
     const SATURDAY = 'Sat'; 
     const SUNDAY = 'Sun'; 

    public function GetYeardays($dateStart, $dateend){ 
    $period = new \DatePeriod(
      new \DateTime($dateStart), new \DateInterval('P1D'), (new \DateTime($dateend)) 
    ); 
    $dates = iterator_to_array($period); 

    $arrayreturn = array(); 
    foreach ($dates as $val) { 
     $date = $val->format('Y-m-d'); //format date 
     $get_name = date('l', strtotime($date)); //get week day 
     $day_name = substr($get_name, 0, 3); // Trim day name to 3 chars 
     switch ($day_name) { 
      case self::MONDAY: 
       $MONDAY[] = $date; 
       $arrayreturn[self::MONDAY] = $MONDAY; 
       break; 
      case self::TUESDAY: 
       $TUESDAY[] = $date; 
       $arrayreturn[self::TUESDAY] = $TUESDAY; 
       break; 
      case self::WEDENSDAY: 
       $WEDENSDAY[] = $date; 
       $arrayreturn[self::WEDENSDAY] = $WEDENSDAY; 
       break; 
      case self::THURSDAY: 
       $THURSDAY[] = $date; 
       $arrayreturn[self::THURSDAY] = $THURSDAY; 
       break; 
      case self::FRIDAY: 
       $FRIDAY[] = $date; 
       $arrayreturn[self::FRIDAY] = $FRIDAY; 
       break; 
      case self::SATURDAY: 
       $SATURDAY[] = $date; 
       $arrayreturn[self::SATURDAY] = $SATURDAY; 
       break; 
      case self::SUNDAY: 
       $SUNDAY[] = $date; 
       $arrayreturn[self::SUNDAY] = $SUNDAY; 
       break; 
     } 
    } 
    return $arrayreturn; 
    } 
} 

輸出會是這樣

array (size=7) 
'Fri' => 
    array (size=5) 
    0 => string '2016/01/01' (length=10) 
    1 => string '2016/01/08' (length=10) 
    2 => string '2016/01/15' (length=10) 
    3 => string '2016/01/22' (length=10) 
    4 => string '2016/01/29' (length=10) 
'Sat' => 
array (size=5) 
    0 => string '2016/01/02' (length=10) 
    1 => string '2016/01/09' (length=10) 
    2 => string '2016/01/16' (length=10) 
    3 => string '2016/01/23' (length=10) 
    4 => string '2016/01/30' (length=10) 
'Sun' => 
array (size=4) 
    0 => string '2016/01/03' (length=10) 
    1 => string '2016/01/10' (length=10) 
    2 => string '2016/01/17' (length=10) 
    3 => string '2016/01/24' (length=10) 
'Mon' => 
array (size=4) 
    0 => string '2016/01/04' (length=10) 
    1 => string '2016/01/11' (length=10) 
    2 => string '2016/01/18' (length=10) 
    3 => string '2016/01/25' (length=10) 
'Tue' => 
array (size=4) 
    0 => string '2016/01/05' (length=10) 
    1 => string '2016/01/12' (length=10) 
    2 => string '2016/01/19' (length=10) 
    3 => string '2016/01/26' (length=10) 
'Wed' => 
array (size=4) 
    0 => string '2016/01/06' (length=10) 
    1 => string '2016/01/13' (length=10) 
    2 => string '2016/01/20' (length=10) 
    3 => string '2016/01/27' (length=10) 
    'Thu' => 
array (size=4) 
    0 => string '2016/01/07' (length=10) 
    1 => string '2016/01/14' (length=10) 
    2 => string '2016/01/21' (length=10) 
    3 => string '2016/01/28' (length=10) 
0
$dates = array(); 
$dates[] = strtotime($start); 
for($i = 0; $i <= 12; $i++){ 
    $dates[] = strtotime('+1 week', $dates[$i]); 
} 
foreach($dates as $date){ echo date("d.m.Y", $date); } 

我有類似的問題,課程可以在任何一天開始。該腳本選擇開始日期並每週收集下一天,直到需要的金額(本例中爲12)。

相關問題