web-dev-qa-db-ja.com

日付範囲内のすべての月曜日を取得するためのphp関数

例:$startDateは2007年2月5日月曜日で$endDateは2007-02-20火曜日です。それから私はそれをリストしたい:

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

PHPマニュアルを調べたところ、2つの日付の間のすべての日を取得できることがわかりました。しかし、どのようにすればよいですか?PHPコード:

17
Nisha

すべての日を取得してすべてをループするのではなく、開始日の後の最初の月曜日を取得してから、一度に7日間繰り返します。

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

私は同じものが必要で、簡単な方法を作成しました。

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)

多分それは誰かのために役立つでしょう。

10
Stafox

以下の関数を使用して、特定の日の日付範囲間の日付の配列を取得できます。

開始日、終了日、曜日番号を数字で入力する必要があります。曜日番号は次のとおりです。 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;
 }
6
NASEEM FASAL
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
}
3
Dan Grossman

iクラスを作成すると、すべての日が範囲内の日付グループで取得されます。

 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)
2
Barkati.med
$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)まで毎週次の日を収集します。

1
Anttila

これは、「$ startdate」の平日を取得し、2つの日付の間の平日数をカウントするためのコードです。

 
 `$ startdate` = '2015-03-01'; 
` $ endate` = '2015-03-31'; 
 `$ recurringDay` = date( 'N'、strtotime($ startdate)); //日付か​​らの繰り返し日、つまり月曜日= 1、火曜日= 2 ... etc 
 $ begin = new DateTime( `$ startdate`); 
 $ end = new DateTime(date( 'Ym -d '、strtotime(' + 1 day '、strtotime($ endate)))); 
 while($ begin format(' Ym-d '); 
 $ day [] = $ begin-> format( 'N'); 
 $ begin-> modify( '+ 1 day'); 
} 
 $ c = 0; //カウンター開始
 
 foreach($ day as $ key => $ dt){
 
 if($ dt == `$ recurringDay`)//比較
 {
 $ k [] = $ key; 
 $ c ++; 
} 
} 
 
 `$ nofDays` = $ c; //月曜日の数、火曜日
 
 foreach($ k as $ pp){
 //セッションコードの追加
 `$ recurringDatetime []` = $ period [$ pp]; //定期的な日付
} 
 
 print_r( `$ recurringDatetime`); //月曜日、火曜日..etc [の日付の配列。 ____。]
1
saurabh

として追加するだけで、

$date_from = "2007-02-05";
$date_from = strtotime($date_from);

$date_to="2007-02-20";
$date_to = strtotime($date_to);

for ($i=$date_from; $i<=$date_to; $i+=86400) {
$day = date("Y-m-d", $i);
$unixTimestamp = strtotime($day);

$dayOfWeek = date("l", $unixTimestamp);

if ($dayOfWeek == "Monday") {
    echo $day ."is a". $dayOfWeek;
}
}//end for
1

その前の$ startDateと$ endDateをタイムスタンプに変換します。

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