Saya memiliki 2 tanggal di PHP, bagaimana saya bisa menjalankan foreach loop untuk melewati semua hari-hari itu?

207

Saya mulai dengan tanggal 2010-05-01dan berakhir dengan 2010-05-10. Bagaimana saya bisa mengulang semua tanggal dalam PHP?

Shamoon
sumber

Jawaban:

535

Membutuhkan PHP5.3:

$begin = new DateTime('2010-05-01');
$end = new DateTime('2010-05-10');

$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format("l Y-m-d H:i:s\n");
}

Ini akan menampilkan semua hari dalam periode yang ditentukan antara $startdan $end. Jika Anda ingin memasukkan tanggal 10, atur $endke tanggal 11. Anda dapat menyesuaikan format sesuai keinginan Anda. Lihat Manual PHP untuk DatePeriod .

Gordon
sumber
2
kabar baik - ada tambalan untuk mengatur bendera untuk menyertakan tanggal akhir yang (semoga saja) menjadi versi masa depan.
salathe
8
$begin->setTime(0,0); $end->setTime(12,0);atau menginisialisasi dengan waktu hari dari tanggal mulai karena setiap waktu lebih lama dari tanggal akhir akan termasuk tanggal akhir dalam loop. Bukan perbaikan yang paling bergaya, tapi itu pilihan terbaik selama tidak ada bendera yang tepat.
Chris
31
Jika Anda ingin memasukkan tanggal akhir ke interval Anda, Anda dapat melakukan: $ end = $ end-> memodifikasi ('+1 hari');
JulienITARD
3
Apakah mungkin untuk menggunakan ini tetapi membalikkannya, untuk mengulang sejarah?
Jon
3
@JulienITARD itu ide yang cukup bagus tetapi lebih elegan adalah $ end-> add ($ interval) karena merespons langsung ke interval yang diubah;)
GDY
92

Ini juga termasuk tanggal terakhir

$begin = new DateTime( "2015-07-03" );
$end   = new DateTime( "2015-07-09" );

for($i = $begin; $i <= $end; $i->modify('+1 day')){
    echo $i->format("Y-m-d");
}

Jika Anda tidak perlu kencan terakhir hapus saja =dari kondisinya.

Sabri Aziri
sumber
1
Pastikan untuk mencatat bahwa $beginakan berbeda setelah pengulangan. Loop ini memodifikasi objek yang dibuat oleh new DateTime( "2015-07-03" ). Karenanya mengapa Anda harus menggunakan versi DateTimeImmutable. Tetapi Anda perlu beberapa modifikasi lebih lanjut untuk menggunakannya.
Henk Poley
40

Mengubah ke unix cap waktu membuat melakukan matematika tanggal lebih mudah di php:

$startTime = strtotime( '2010-05-01 12:00' );
$endTime = strtotime( '2010-05-10 12:00' );

// Loop between timestamps, 24 hours at a time
for ( $i = $startTime; $i <= $endTime; $i = $i + 86400 ) {
  $thisDate = date( 'Y-m-d', $i ); // 2010-05-01, 2010-05-02, etc
}

Saat menggunakan PHP dengan zona waktu yang memiliki DST, pastikan untuk menambahkan waktu yang bukan 23:00, 00:00 atau 1:00 untuk melindungi dari berhari-hari melewatkan atau mengulangi.

Harold1983-
sumber
4
Saya tidak suka tampilan 86400 itu. Saya mengerti bahwa itu 60 * 60 * 24, tapi masih ... sesuatu tentang hal itu mengganggu saya.
MikeD
13
dalam hal ini, ini berfungsi, tetapi jika ada pergantian antara waktu normal dan hemat sinar matahari, itu akan gagal karena ada 90000 hari kedua yang akan Anda miliki dua kali dalam putaran Anda ...
oezi
2
Mike, hal terbaik yang harus dilakukan adalah mengatur konstanta dan beri nama "DAY" sehingga menjadi jauh lebih mudah dibaca.
Pengembang Pixel
5
Ini akan menderita masalah penghematan siang hari. Ketika Anda melewati titik waktu penghematan siang hari, itu akan kacau. 12:00 pagi bukan 12:00 pagi di kedua sisi titik waktu.
Eric Cope
1
Kode ini memang (setiap kode dengan 86400 detik per hari) memiliki masalah dengan daylight saving! Dengan penghematan siang hari beberapa hari hanya berlangsung 23 jam, dan beberapa 25 jam.
sbrbot
20

Salin dari sampel php.net untuk rentang inklusif :

$begin = new DateTime( '2012-08-01' );
$end = new DateTime( '2012-08-31' );
$end = $end->modify( '+1 day' ); 

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);

foreach($daterange as $date){
    echo $date->format("Ymd") . "<br>";
}
Alexander Kharchenko
sumber
ini adalah jawaban terbaik dan terlengkap. Hanya kehilangan beberapa penjelasan tentang nilai DateInterval P1D, jadi di sini adalah beberapa contoh Penentu Periode Dua hari: P2D Dua detik: PT2S Satu minggu dan sepuluh menit: P1WT10M Y untuk tahun M untuk bulan D untuk hari W untuk minggu. Ini dapat dikonversi menjadi hari, jadi tidak dapat digabungkan dengan D. H selama berjam-jam M selama beberapa menit S untuk detik
Orcra
15
$startTime = strtotime('2010-05-01'); 
$endTime = strtotime('2010-05-10'); 

// Loop between timestamps, 1 day at a time 
$i = 1;
do {
   $newTime = strtotime('+'.$i++.' days',$startTime); 
   echo $newTime;
} while ($newTime < $endTime);

atau

$startTime = strtotime('2010-05-01'); 
$endTime = strtotime('2010-05-10'); 

// Loop between timestamps, 1 day at a time 
do {
   $startTime = strtotime('+1 day',$startTime); 
   echo $startTime;
} while ($startTime < $endTime);
Mark Baker
sumber
2
Tampaknya solusi ini lebih lambat dari jawaban yang diterima (un berlari beberapa bangku: 100% lebih lambat untuk 60 iterasi). Tapi saya memilih yang ini untuk kompatibilitas retro untuk bentuk hosting lama.
Ifnot
7

Ini adalah satu lagi sederhana -

/**
 * Date range
 *
 * @param $first
 * @param $last
 * @param string $step
 * @param string $format
 * @return array
 */
function dateRange( $first, $last, $step = '+1 day', $format = 'Y-m-d' ) {
    $dates = [];
    $current = strtotime( $first );
    $last = strtotime( $last );

    while( $current <= $last ) {

        $dates[] = date( $format, $current );
        $current = strtotime( $step, $current );
    }

    return $dates;
}

Contoh:

print_r( dateRange( '2010-07-26', '2010-08-05') );

Array (
    [0] => 2010-07-26
    [1] => 2010-07-27
    [2] => 2010-07-28
    [3] => 2010-07-29
    [4] => 2010-07-30
    [5] => 2010-07-31
    [6] => 2010-08-01
    [7] => 2010-08-02
    [8] => 2010-08-03
    [9] => 2010-08-04
    [10] => 2010-08-05
)
HADI
sumber
5

Pengguna fungsi ini: -

function dateRange($first, $last, $step = '+1 day', $format = 'Y-m-d' ) {
                $dates = array();
                $current = strtotime($first);
                $last = strtotime($last);

                while( $current <= $last ) {    
                    $dates[] = date($format, $current);
                    $current = strtotime($step, $current);
                }
                return $dates;
        }

Panggilan penggunaan / fungsi: -

Meningkat satu hari: -

dateRange($start, $end); //increment is set to 1 day.

Tingkatkan Bulan: -

dateRange($start, $end, "+1 month");//increase by one month

gunakan parameter ketiga jika Anda ingin mengatur format tanggal: -

   dateRange($start, $end, "+1 month", "Y-m-d H:i:s");//increase by one month and format is mysql datetime
pengguna2182143
sumber
2

ini caranya:

 $date = new Carbon();
 $dtStart = $date->startOfMonth();
 $dtEnd = $dtStart->copy()->endOfMonth();

 $weekendsInMoth = [];
 while ($dtStart->diffInDays($dtEnd)) {

     if($dtStart->isWeekend()) {
            $weekendsInMoth[] = $dtStart->copy();
     }

     $dtStart->addDay();
 }

Hasil $ weekendsInMoth adalah serangkaian hari akhir pekan!

Jean Souza
sumber
0
$date = new DateTime($_POST['date']);
$endDate = date_add(new DateTime($_POST['date']),date_interval_create_from_date_string("7 days"));

while ($date <= $endDate) {
    print date_format($date,'d-m-Y')." AND END DATE IS : ".date_format($endDate,'d-m-Y')."\n";
    date_add($date,date_interval_create_from_date_string("1 days"));
}

Anda dapat mengulangi seperti ini juga, Ini $_POST['date']dapat lekukan dari aplikasi atau situs web $_POST['date']Anda. Selain itu, Anda juga dapat menempatkan string di sini "21-12-2019". Keduanya akan bekerja.

zukayu
sumber
0

Jika Anda menggunakan Laravel dan ingin menggunakan Karbon, solusi yang benar adalah sebagai berikut:

$start_date = Carbon::createFromFormat('Y-m-d', '2020-01-01');
$end_date = Carbon::createFromFormat('Y-m-d', '2020-01-31');

$period = new CarbonPeriod($start_date, '1 day', $end_date);

foreach ($period as $dt) {
 echo $dt->format("l Y-m-d H:i:s\n");
}

Ingatlah untuk menambahkan:

  • gunakan Carbon \ Carbon;
  • gunakan Carbon \ CarbonPeriod;
Victor Nuñez
sumber
0
<?php

    $start_date = '2015-01-01';
    $end_date = '2015-06-30';

    while (strtotime($start_date) <= strtotime($end_date)) {
        echo "$start_daten";
        $start_date = date ("Y-m-d", strtotime("+1 days", strtotime($start_date)));
    }

?>
Soteris 92
sumber