Menemukan jumlah hari antara dua tanggal

617

Bagaimana menemukan jumlah hari antara dua tanggal menggunakan PHP?

PHP Ferrari
sumber
6
Satu liner:(new DateTime("2010-01-11"))->diff(new DateTime("2019-08-19"))->days;
billynoah
@ billynoah - ini adalah jawaban paling bersih dan lebih sederhana!
rolinger

Jawaban:

907
$now = time(); // or your date as well
$your_date = strtotime("2010-01-31");
$datediff = $now - $your_date;

echo round($datediff / (60 * 60 * 24));
Adnan
sumber
39
Saya pikir mengembalikan sejumlah hari negatif memberikan informasi yang relevan. Dan Anda harus menggunakan $your_date-$now, jika Anda ingin masa depan mengembalikan integer positif.
Tim
23
Bagaimana dengan detik kabisat? Tidak semua hari memiliki tepat 24 * 60 * 60 detik. Kode ini mungkin cukup untuk tujuan praktis tetapi tidak tepat dalam kasus tepi yang sangat langka.
Benjamin Brizzi
49
Lupa detik kabisat (tidak, sebenarnya pertimbangkan itu juga) tetapi ini TIDAK memperhitungkan perubahan Waktu Musim Panas! Itu bisa dimatikan sepanjang hari atas batas-batas itu setiap tahun. Anda perlu menggunakan kelas DateTime.
Lewi
6
@ billynoah Maaf, saya tidak pernah kembali untuk memperbarui komentar saya. Anda harus berhati-hati dengan zona waktu musim panas. Jika Anda membandingkan tanggal dengan daylight saving dengan tanggal tanpa itu, sebagai gantinya misalnya mengembalikan 7 hari itu mengembalikan 6,9 hari. Mengambil kembali lantai 6 bukannya 7.
Alex Angelico
4
Tidak hanya strtotime () gagal dalam 20 tahun, itu tidak dapat digunakan sekarang. OP menentukan Tanggal, bukan Waktu. Tanggal bisa sangat tua. Inilah jawaban yang lebih sederhana: $ NumberDays = gregoriantojd ($ EndM, $ EndD, $ EndY) - gregoriantojd ($ StartM, $ StartD, $ StartY); (untuk rentang inklusif). Berbeda dengan Kelas Datetime, Gregorian ke Julian tersedia di v4 ke atas. Kisaran yang valid adalah 4714 SM hingga 9999 M. Waspadai urutan parameter yang funky (seperti Anda memerlukan peringatan untuk php).
Guy Gordon
524

Jika Anda menggunakan PHP 5.3 >, ini adalah cara paling akurat untuk menghitung perbedaan:

$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");

$diff = $later->diff($earlier)->format("%a");
Saksham Gupta
sumber
14
Perhatikan bahwa karena kita berbicara tentang interval waktu bukan titik waktu tertentu, sintaks format berbeda dari sintaks tanggal () dan strftime (). Sintaks interval waktu dapat ditemukan di sini: php.net/manual/en/dateinterval.format.php
Andrew
1
atau dalam kasus saya jumlah hari antara adalah $ date2-> diff ($ date1) -> format ("% a") - 1
xeo
13
Perlu diingat bahwa jika Anda memiliki waktu dalam kencan Anda, ini tidak akan berfungsi seperti yang Anda harapkan. Misalnya, jika Anda memiliki interval 23:30 jam ... dan mereka ada di hari yang berbeda, perbedaannya adalah 0.
Layke
20
Jika Anda membutuhkan jumlah hari relatif (negatif bila $date1anterior $date2), gunakan $diff = $date2->diff($date1)->format("%r%a");sebagai gantinya.
Socce
1
Apa format tanggal dalam DateTime("2010-07-06")?, apakah itu Y-m-datau Y-d-m?, apa format DateTimeparameter. yang mana hari?
151291
165

Dari PHP Versi 5.3 dan lebih tinggi, fungsi tanggal / waktu baru telah ditambahkan untuk mendapatkan perbedaan:

$datetime1 = new DateTime("2010-06-20");

$datetime2 = new DateTime("2011-06-22");

$difference = $datetime1->diff($datetime2);

echo 'Difference: '.$difference->y.' years, ' 
                   .$difference->m.' months, ' 
                   .$difference->d.' days';

print_r($difference);

Hasil seperti di bawah ini:

Difference: 1 years, 0 months, 2 days

DateInterval Object
(
    [y] => 1
    [m] => 0
    [d] => 2
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 367
)

Semoga ini bisa membantu!

Aditya P Bhatt
sumber
8
Ya, ini tampaknya lebih baik daripada jawaban yang diterima, yang tidak berfungsi dalam beberapa kasus. Suka: $ from = '2014-03-01'; $ to = '2014-03-31';
MBozic
1
Saya setuju, sangat mudah diikuti dan bekerja dengan luar biasa !!! Hanya saja, jangan lupa untuk menggunakan fungsi date_default_timezone_set () atau itu akan memberi Anda hasil aneh berdasarkan waktu UTC.
zeckdude
2
Fungsi ini gagal 0 dari 14603 tes antara 1980 dan 2020.
LSerni
128

Ubah tanggal Anda menjadi unix cap waktu, lalu kurangi satu dari yang lainnya. Itu akan memberi Anda perbedaan dalam hitungan detik, yang Anda bagi dengan 86400 (jumlah detik dalam sehari) untuk memberi Anda perkiraan jumlah hari dalam rentang itu.

Jika tanggal Anda dalam format 25.1.2010, 01/25/2010atau 2010-01-25, Anda dapat menggunakan strtotimefungsi:

$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');

$days_between = ceil(abs($end - $start) / 86400);

Menggunakan ceilputaran jumlah hari hingga hari penuh berikutnya. Gunakan floorsebaliknya jika Anda ingin mendapatkan jumlah hari penuh antara dua tanggal tersebut.

Jika tanggal Anda sudah dalam format cap waktu unix, Anda dapat melewati konversi dan cukup lakukan $days_betweenbagian. Untuk format tanggal yang lebih eksotis, Anda mungkin harus melakukan parsing khusus untuk memperbaikinya.

Tatu Ulmanen
sumber
9
Bagaimana dengan DST?
toon81
3
@ toon81 - kami menggunakan cap waktu Unix untuk menghindari kekacauan seperti itu! ;)
Alastair
6
Biarkan saya menguraikan: katakanlah pagi ini jam 3 pagi, hampir seluruh Eropa mengembalikan jam satu jam. Itu berarti bahwa hari ini memiliki 3600 detik ekstra, dan itu harus tercermin dalam cap waktu UNIX. Jika ya, berarti hari ini akan dihitung selama dua hari dengan cara menghitung jumlah hari di atas. Dan saya bahkan tidak memulai sekitar detik kabisat karena baik PHP maupun UNIX tampaknya tidak memperhitungkan itu (yang sebenarnya IMO dapat dimengerti). TL; DR: tidak semua hari panjangnya 86.400 detik .
toon81
2
@ toon81 TIDAK 3600 detik lagi untuk tanggal itu. Tidak ada yang terjadi pada cap waktu UNIX saat pergi ke atau dari DST.
nickdnk
1
Jika tidak ada yang terjadi pada stempel waktu UNIX, maka Anda setuju dengan saya: perbedaan antara stempel waktu UNIX pada jam 1 siang $daydan stempel waktu UNIX jam 1 siang $day+1tidak selalu 86400 detik dalam zona waktu yang mengamati DST. Mungkin bernilai 23 atau 25 jam dalam hitungan detik alih-alih 24 jam.
toon81
112

TL; DR jangan tidak menggunakan UNIX cap waktu. Jangan gunakantime() . Jika Anda melakukannya, bersiaplah jika keandalan 98,0825% gagal Anda. Gunakan DateTime (atau Karbon).

The jawaban yang benar adalah salah satu yang diberikan oleh Saksham Gupta (jawaban lain juga benar):

$date1 = new DateTime('2010-07-06');
$date2 = new DateTime('2010-07-09');
$days  = $date2->diff($date1)->format('%a');

Atau secara prosedural sebagai one-liner:

/**
 * Number of days between two dates.
 *
 * @param date $dt1    First date
 * @param date $dt2    Second date
 * @return int
 */
function daysBetween($dt1, $dt2) {
    return date_diff(
        date_create($dt2),  
        date_create($dt1)
    )->format('%a');
}

Dengan peringatan: '% a' tampaknya menunjukkan jumlah hari absolut . Jika Anda menginginkannya sebagai bilangan bulat yang ditandatangani, yaitu negatif ketika tanggal kedua adalah sebelum tanggal pertama, maka Anda perlu menggunakan awalan '% r' (yaitu format('%r%a')).


Jika Anda benar-benar harus menggunakan cap waktu UNIX, atur zona waktu ke GMT untuk menghindari sebagian besar jebakan yang dirinci di bawah ini.


Jawaban panjang: mengapa membaginya dengan 24 * 60 * 60 (alias 86400) tidak aman

Sebagian besar jawaban menggunakan cap waktu UNIX (dan 86400 untuk mengonversikannya menjadi beberapa hari) membuat dua asumsi yang, jika disatukan, dapat menghasilkan skenario dengan hasil yang salah dan bug halus yang mungkin sulit dilacak, dan timbul beberapa hari, minggu atau bulan setelahnya. penyebaran yang sukses. Bukannya solusinya tidak bekerja - itu berhasil. Hari ini. Tetapi mungkin berhenti bekerja besok.

Kesalahan pertama adalah tidak mempertimbangkan bahwa ketika ditanya, "Berapa hari telah berlalu sejak kemarin?", Komputer mungkin akan menjawab nol jika antara saat ini dan saat yang ditunjukkan oleh "kemarin" kurang dari satu hari penuh telah berlalu.

Biasanya ketika mengonversi "hari" ke cap waktu UNIX, yang diperoleh adalah cap waktu untuk tengah malam hari itu.

Jadi antara tengah malam 1 Oktober dan 15 Oktober, lima belas hari telah berlalu. Tetapi antara 13:00 tanggal 1 Oktober dan 14:55 tanggal 15 Oktober, lima belas hari dikurangi 5 menit telah berlalu, dan sebagian besar solusi menggunakan floor()atau melakukan konversi bilangan bulat implisit akan melaporkan satu hari kurang dari yang diharapkan .

Jadi, "berapa hari yang lalu Ymd H: i: s"? akan menghasilkan jawaban yang salah .

Kesalahan kedua adalah menyamakan satu hari menjadi 86400 detik. Ini hampir selalu benar - itu terjadi cukup sering untuk mengabaikan kali tidak. Tetapi jarak dalam detik antara dua tengah malam berturut-turut tentu tidak 86400 setidaknya dua kali setahun ketika waktu musim panas ikut bermain. Membandingkan dua tanggal melintasi batas DST akan menghasilkan jawaban yang salah.

Jadi, bahkan jika Anda menggunakan "peretasan" untuk memaksa semua cap waktu tanggal menjadi jam tetap, katakan tengah malam (ini juga dilakukan secara implisit oleh berbagai bahasa dan kerangka kerja ketika Anda hanya menentukan hari-bulan-tahun dan bukan juga menit-menit-detik; happpens yang sama dengan tipe DATE dalam database seperti MySQL), rumus yang banyak digunakan

 (unix_timestamp(DATE2) - unix_timestamp(DATE1)) / 86400

atau

 floor(time() - strtotime($somedate)) / 86400

akan kembali, misalnya, 17 ketika DATE1 dan DATE2 berada di segmen DST yang sama tahun ini; tetapi mungkin mengembalikan 17.042, dan lebih buruk lagi, 16.958. Penggunaan floor () atau pemotongan implisit ke bilangan bulat kemudian akan mengonversi apa yang seharusnya menjadi 17 menjadi 16. Dalam keadaan lain, ekspresi seperti "$ hari> 17" akan kembali trueuntuk 17.042 bahkan jika ini menunjukkan bahwa jumlah hari yang telah berlalu adalah 18.

Dan hal-hal tumbuh lebih buruk karena kode tersebut tidak portabel di seluruh platform, karena beberapa dari mereka mungkin berlaku detik kabisat dan beberapa mungkin tidak . Pada platform yang melakukannya , perbedaan antara dua tanggal tidak akan menjadi 86400 tetapi 86401, atau mungkin 86399. Jadi kode yang bekerja pada bulan Mei dan benar-benar lulus semua tes akan berakhir pada Juni mendatang ketika 12,99999 hari dianggap 12 hari, bukan 13. Dua tanggal yang bekerja pada tahun 2015 tidak akan berfungsi pada tahun 2017 - tanggal yang sama , dan tahun tidak merupakan tahun kabisat. Tetapi antara 2018-03-01 dan 2017-03-01, pada platform yang peduli, 366 hari akan berlalu sebagai ganti 365, menjadikan 2018 sebagai tahun kabisat (yang bukan).

Jadi, jika Anda benar-benar ingin menggunakan cap waktu UNIX:

  • gunakan round()fungsi dengan bijak, bukan floor().

  • sebagai alternatif, jangan menghitung perbedaan antara D1-M1-YYY1 dan D2-M2-YYY2. Tanggal-tanggal tersebut akan benar-benar dianggap sebagai D1-M1-YYY1 00:00:00 dan D2-M2-YYY2 00:00:00. Sebaliknya, konversi antara D1-M1-YYY1 22:30:00 dan D2-M2-YYY2 04:30:00. Anda akan selalu mendapatkan sisa sekitar dua puluh jam. Ini bisa menjadi dua puluh satu jam atau sembilan belas, dan mungkin delapan belas jam, lima puluh sembilan menit tiga puluh enam detik. Tidak penting. Ini adalah margin besar yang akan tinggal di sana dan tetap positif untuk masa mendatang. Sekarang Anda dapat memotongnya dengan floor()aman.

The benar solusi meskipun, untuk menghindari konstanta ajaib, pembulatan kludges dan utang pemeliharaan, adalah untuk

  • gunakan perpustakaan waktu (Datetime, Carbon, apa pun); jangan roll Anda sendiri

  • tulis kasus uji komprehensif menggunakan pilihan tanggal yang benar-benar jahat - melintasi batas DST, melintasi tahun kabisat, melintasi detik kabisat, dan seterusnya, serta tanggal yang biasa. Idealnya (panggilan ke datetime cepat !) Menghasilkan empat tahun penuh (dan satu hari) senilai tanggal dengan mengumpulkan mereka dari string, secara berurutan, dan memastikan bahwa perbedaan antara hari pertama dan hari yang diuji meningkat dengan mantap satu. Ini akan memastikan bahwa jika ada perubahan dalam rutinitas tingkat rendah dan lompatan detik perbaikan mencoba untuk mendatangkan malapetaka, setidaknya Anda akan tahu .

  • jalankan tes-tes tersebut secara teratur bersama-sama dengan sisa test suite lainnya. Mereka hanya dalam hitungan milidetik, dan dapat menghemat waktu Anda menggaruk kepala selama beberapa jam .


Apa pun solusi Anda, ujilah!

Fungsi di funcdiffbawah ini mengimplementasikan salah satu solusi (seperti yang terjadi, yang diterima) dalam skenario dunia nyata.

<?php
$tz         = 'Europe/Rome';
$yearFrom   = 1980;
$yearTo     = 2020;
$verbose    = false;

function funcdiff($date2, $date1) {
    $now        = strtotime($date2);
    $your_date  = strtotime($date1);
    $datediff   = $now - $your_date;
    return floor($datediff / (60 * 60 * 24));
}
########################################

date_default_timezone_set($tz);
$failures   = 0;
$tests      = 0;

$dom = array ( 0, 31, 28, 31, 30,
                  31, 30, 31, 31,
                  30, 31, 30, 31 );
(array_sum($dom) === 365) || die("Thirty days hath September...");
$last   = array();
for ($year = $yearFrom; $year < $yearTo; $year++) {
    $dom[2] = 28;
    // Apply leap year rules.
    if ($year % 4 === 0)   { $dom[2] = 29; }
    if ($year % 100 === 0) { $dom[2] = 28; }
    if ($year % 400 === 0) { $dom[2] = 29; }
    for ($month = 1; $month <= 12; $month ++) {
        for ($day = 1; $day <= $dom[$month]; $day++) {
            $date = sprintf("%04d-%02d-%02d", $year, $month, $day);
            if (count($last) === 7) {
                $tests ++;
                $diff = funcdiff($date, $test = array_shift($last));
                if ((double)$diff !== (double)7) {
                    $failures ++;
                    if ($verbose) {
                        print "There seem to be {$diff} days between {$date} and {$test}\n";
                    }
                }
            }
            $last[] = $date;
        }
    }
}

print "This function failed {$failures} of its {$tests} tests between {$yearFrom} and {$yearTo}.\n";

Hasilnya adalah,

This function failed 280 of its 14603 tests

Kisah Horor: biaya "menghemat waktu"

Ini sebenarnya terjadi beberapa bulan lalu. Seorang programmer yang cerdik memutuskan untuk menghemat beberapa mikrodetik dari perhitungan yang paling banyak memakan waktu sekitar tiga puluh detik, dengan memasukkan kode "(MidnightOfDateB-MidnightOfDateA) / 86400" yang terkenal di beberapa tempat. Itu sangat jelas optimasi sehingga dia bahkan tidak mendokumentasikannya, dan optimasi melewati tes integrasi dan mengintai dalam kode selama beberapa bulan, semua tanpa disadari.

Ini terjadi dalam sebuah program yang menghitung upah untuk beberapa penjual terlaris, yang paling sedikit memiliki pengaruh yang jauh lebih menakutkan daripada tim programmer beranggotakan lima orang yang dibuat bersama. Suatu hari beberapa bulan yang lalu, dengan alasan yang tidak terlalu penting, serangga itu menyerang - dan beberapa dari mereka kehilangan satu hari penuh komisi lemak. Mereka jelas tidak senang.

Yang jauh lebih buruk, mereka kehilangan kepercayaan (yang sudah sangat sedikit) yang mereka miliki dalam program yang tidak dirancang untuk secara diam-diam menghabisi mereka, dan berpura-pura - dan memperoleh - tinjauan kode lengkap dan terperinci dengan kasus uji yang dijalankan dan berkomentar dalam istilah awam (ditambah banyak) perawatan karpet merah pada minggu-minggu berikutnya).

Apa yang bisa saya katakan: di sisi positifnya, kami menyingkirkan banyak hutang teknis, dan mampu menulis ulang dan merevisi beberapa bagian dari kekacauan spageti yang menyimak kembali ke serangan COBOL di tahun 90-an yang berayun. Program ini tidak diragukan lagi berjalan lebih baik sekarang, dan ada banyak lagi informasi debug untuk segera dihapus ketika ada sesuatu yang mencurigakan. Saya memperkirakan bahwa hanya satu hal terakhir ini akan menghemat mungkin satu atau dua hari kerja per bulan untuk masa yang akan datang.

Di sisi minusnya, seluruh brouhaha membuat perusahaan harus membayar sekitar € 200.000 di muka - plus muka, ditambah tidak diragukan lagi daya tawar (dan, karenanya, lebih banyak uang).

Orang yang bertanggung jawab untuk "optimasi" telah berganti pekerjaan setahun yang lalu, sebelum bencana, tetapi masih ada pembicaraan untuk menuntutnya atas kerusakan. Dan itu tidak sesuai dengan eselon atas bahwa itu adalah "kesalahan orang terakhir" - itu tampak seperti pengaturan bagi kita untuk menyelesaikan masalah ini, dan pada akhirnya, kita masih berada di rumah anjing dan salah satu tim berencana untuk berhenti.

Sembilan puluh sembilan dari seratus, "86400 hack" akan bekerja dengan sempurna. (Misalnya dalam PHP, strtotime()akan mengabaikan DST dan melaporkan bahwa antara tengah malam Sabtu terakhir Oktober dan Senin berikutnya, tepatnya 2 * 24 * 60 * 60 detik telah berlalu, bahkan jika itu jelas tidak benar ... dan dua kesalahan dengan senang hati akan memperbaikinya).

Saudara-saudara, ini adalah satu contoh ketika tidak. Seperti kantung udara dan sabuk pengaman, Anda mungkin tidak akan pernah benar - benar membutuhkan kompleksitas (dan kemudahan penggunaan) dari DateTimeatau Carbon. Tetapi hari ketika Anda mungkin (atau hari ketika Anda harus membuktikan bahwa Anda memikirkan hal ini) akan datang sebagai pencuri di malam hari. Dipersiapkan.

LSerni
sumber
7
Ketika saya melihat jawaban ini, saya pikir saya bodoh dan gila karena saya selalu menggunakan DateTime, tetapi Anda membuat saya mengerti bahwa menggunakan DateTime adalah cara yang benar. Terima kasih
Syncro
Hai, semuanya di sini, di SO, dapatkan di sini dengan mencari di google days between two days in phpatau serupa, hanya karena hidup ini terlalu singkat untuk menulis semuanya sendiri.
Denis Matafonov
1
penjelasan terperinci. +1
Anant Singh --- Alive to Die
1
Kadang-kadang saya berharap kita bisa lebih menyukai jawaban daripada pertanyaan.
Clément Baconnier
ini harus menjadi jawaban yang diterima.
Franz
16

Mudah digunakan date_diff

$from=date_create(date('Y-m-d'));
$to=date_create("2013-03-15");
$diff=date_diff($to,$from);
print_r($diff);
echo $diff->format('%R%a days');
Balaji D
sumber
Ini adalah cara prosedural yang baik untuk melakukannya menggunakan kelas DateTime. Itu hanya kurang jelas menggunakan objek interval ( $diffvariabel dalam hal ini). Sesuatu seperti if ($diff->days > 30) { [doyourstuff]; }
Gusstavv Gil
16

Gaya berorientasi objek:

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

Gaya prosedural:

$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%R%a days');
pengguna2182143
sumber
11

Digunakan ini :)

$days = (strtotime($endDate) - strtotime($startDate)) / (60 * 60 * 24);
print $days;

Sekarang berhasil

PHP Ferrari
sumber
14
Komentar yang sangat lama di atas, tetapi itu tidak benar. StackOverflow tidak memungkinkan Anda untuk menjawab pertanyaan Anda sendiri (bahkan ketika Anda bertanya pertanyaan Anda). Namun, menjawab pertanyaan sendiri setelah seseorang memposting solusi yang sama dianggap tidak sopan.
Maarten Bodewes
Fungsi ini gagal 560 dari 14603 tesnya antara 1980 dan 2020.
LSerni
10

Yah, jawaban yang dipilih bukan yang paling benar karena akan gagal di luar UTC. Bergantung pada zona waktu ( daftar ), mungkin ada penyesuaian waktu yang membuat hari "tanpa" 24 jam, dan ini akan membuat perhitungan (60 * 60 * 24) gagal.

Ini dia contohnya:

date_default_timezone_set('europe/lisbon');
$time1 = strtotime('2016-03-27');
$time2 = strtotime('2016-03-29');
echo floor( ($time2-$time1) /(60*60*24));
 ^-- the output will be **1**

Jadi solusi yang benar akan menggunakan DateTime

date_default_timezone_set('europe/lisbon');
$date1 = new DateTime("2016-03-27");
$date2 = new DateTime("2016-03-29");

echo $date2->diff($date1)->format("%a");
 ^-- the output will be **2**
Miguel Costa
sumber
7

Hitung perbedaan antara dua tanggal:

$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");

$diff=date_diff($date1,$date2);

echo $diff->format("%R%a days");

Output: +272 hari

Fungsi date_diff () mengembalikan perbedaan antara dua objek DateTime.

SM Imtiaz Hussain
sumber
6
$start = '2013-09-08';
$end = '2013-09-15';
$diff = (strtotime($end)- strtotime($start))/24/3600; 
echo $diff;
power66x
sumber
Fungsi ini gagal 560 dari 14603 tes antara 1980 dan 2020.
LSerni
6

Saya menggunakan Karbon dalam proyek komposer saya untuk ini dan tujuan serupa.

Ini akan semudah ini:

$dt = Carbon::parse('2010-01-01');
echo $dt->diffInDays(Carbon::now());
Arda
sumber
5

Anda dapat menemukan tanggal hanya dengan

<?php
$start  = date_create('1988-08-10');
$end    = date_create(); // Current time and date
$diff   = date_diff( $start, $end );

echo 'The difference is ';
echo  $diff->y . ' years, ';
echo  $diff->m . ' months, ';
echo  $diff->d . ' days, ';
echo  $diff->h . ' hours, ';
echo  $diff->i . ' minutes, ';
echo  $diff->s . ' seconds';
// Output: The difference is 28 years, 5 months, 19 days, 20 hours, 34 minutes, 36 seconds

echo 'The difference in days : ' . $diff->days;
// Output: The difference in days : 10398
Chamikara Samarasekara
sumber
4
$datediff = floor(strtotime($date1)/(60*60*24)) - floor(strtotime($date2)/(60*60*24));

dan, jika perlu:

$datediff=abs($datediff);
Gratianus
sumber
3

Jika Anda memiliki waktu dalam detik (cap waktu IE unix), maka Anda cukup mengurangi waktu dan membaginya dengan 86400 (detik per hari)

zmbush
sumber
3

jumlah hari antara dua tanggal dalam PHP

      function dateDiff($date1, $date2)  //days find function
        { 
            $diff = strtotime($date2) - strtotime($date1); 
            return abs(round($diff / 86400)); 
        } 
       //start day
       $date1 = "11-10-2018";        
       // end day
       $date2 = "31-10-2018";    
       // call the days find fun store to variable 
       $dateDiff = dateDiff($date1, $date2); 

       echo "Difference between two dates: ". $dateDiff . " Days "; 
mallikarjun SK
sumber
1
Hebat itu bekerja seperti pesona, bisakah Anda memberi tahu untuk apa 86400 num?
Parth Shah
Nomor 86400 digunakan untuk 1 hari = 24 jam dan 24 * 60 * 60 = 86400 detik dalam sehari
mallikarjun SK
3

Anda dapat mencoba kode di bawah ini:

$dt1 = strtotime("2019-12-12"); //Enter your first date
$dt2 = strtotime("12-12-2020"); //Enter your second date
echo abs(($dt1 - $dt2) / (60 * 60 * 24));
Rushikesh Shinde
sumber
2
Dengan pertanyaan lama yang memiliki jawaban yang ada, berguna untuk menjelaskan aspek baru apa yang dibawa oleh jawaban Anda ke pertanyaan. Jika relevan, berguna juga untuk mengakui segala perubahan yang mungkin terjadi sejak pertanyaan diajukan.
Jason Aller
2
function howManyDays($startDate,$endDate) {

    $date1  = strtotime($startDate." 0:00:00");
    $date2  = strtotime($endDate." 23:59:59");
    $res    =  (int)(($date2-$date1)/86400);        

return $res;
} 
Thor
sumber
Fungsi ini gagal 320 dari 14603 tes antara 1980 dan 2020.
LSerni
2

Jika Anda ingin mengulangi semua hari antara tanggal mulai dan berakhir, saya membuat ini:

$startdatum = $_POST['start']; // starting date
$einddatum = $_POST['eind']; // end date

$now = strtotime($startdatum);
$your_date = strtotime($einddatum);
$datediff = $your_date - $now;
$number = floor($datediff/(60*60*24));

for($i=0;$i <= $number; $i++)
{
    echo date('d-m-Y' ,strtotime("+".$i." day"))."<br>";
}
Refilon
sumber
2

Cara termudah untuk menemukan perbedaan hari antara dua tanggal

$date1 = strtotime("2019-05-25"); 
$date2 = strtotime("2010-06-23");

$date_difference = $date2 - $date1;

$result =  round( $date_difference / (60 * 60 * 24) );

echo $result;
Cinta Kumar
sumber
1
    // Change this to the day in the future
$day = 15;

// Change this to the month in the future
$month = 11;

// Change this to the year in the future
$year = 2012;

// $days is the number of days between now and the date in the future
$days = (int)((mktime (0,0,0,$month,$day,$year) - time(void))/86400);

echo "There are $days days until $day/$month/$year";
engineervix
sumber
1

Ini adalah versi saya yang ditingkatkan yang menunjukkan 1 Tahun 2 Bulan 25 hari jika parameter ke-2 dilewati.

class App_Sandbox_String_Util {
    /**
     * Usage: App_Sandbox_String_Util::getDateDiff();
     * @param int $your_date timestamp
     * @param bool $hr human readable. e.g. 1 year(s) 2 day(s)
     * @see http://stackoverflow.com/questions/2040560/finding-the-number-of-days-between-two-dates
     * @see http://qSandbox.com
     */
    static public function getDateDiff($your_date, $hr = 0) {
        $now = time(); // or your date as well
        $datediff = $now - $your_date;
        $days = floor( $datediff / ( 3600 * 24 ) );

        $label = '';

        if ($hr) {
            if ($days >= 365) { // over a year
                $years = floor($days / 365);
                $label .= $years . ' Year(s)';
                $days -= 365 * $years;
            }

            if ($days) {
                $months = floor( $days / 30 );
                $label .= ' ' . $months . ' Month(s)';
                $days -= 30 * $months;
            }

            if ($days) {
                $label .= ' ' . $days . ' day(s)';
            }
        } else {
            $label = $days;
        }

        return $label;
    }
}
Svetoslav Marinov
sumber
1
$early_start_date = date2sql($_POST['early_leave_date']);


$date = new DateTime($early_start_date);
$date->modify('+1 day');


$date_a = new DateTime($early_start_date . ' ' . $_POST['start_hr'] . ':' . $_POST['start_mm']);
$date_b = new DateTime($date->format('Y-m-d') . ' ' . $_POST['end_hr'] . ':' . $_POST['end_mm']);

$interval = date_diff($date_a, $date_b);


$time = $interval->format('%h:%i');
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60;
//        display_error($seconds);

$second3 = $employee_information['shift'] * 60 * 60;

if ($second3 < $seconds)
    display_error(_('Leave time can not be greater than shift time.Please try again........'));
    set_focus('start_hr');
    set_focus('end_hr');
    return FALSE;
}
kekuatan radhason
sumber
1
<?php
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
?>

menggunakan kode di atas sangat sederhana. Terima kasih.

Y. Joy Ch. Singha
sumber
1
function get_daydiff($end_date,$today)
{
    if($today=='')
    {
        $today=date('Y-m-d');
    }
    $str = floor(strtotime($end_date)/(60*60*24)) - floor(strtotime($today)/(60*60*24));
    return $str;
}
$d1 = "2018-12-31";
$d2 = "2018-06-06";
echo get_daydiff($d1, $d2);
pengguna3216114
sumber
1

Menggunakan fungsi sederhana ini. Deklarasikan fungsi

<?php
function dateDiff($firstDate,$secondDate){
    $firstDate = strtotime($firstDate);
    $secondDate = strtotime($secondDate);

    $datediff = $firstDate - $secondDate;
    $output = round($datediff / (60 * 60 * 24));
    return $output;
}
?>

dan panggil fungsi ini seperti ini di tempat yang Anda inginkan

<?php
    echo dateDiff("2018-01-01","2018-12-31");    

// OR

    $firstDate = "2018-01-01";
    $secondDate = "2018-01-01";
    echo dateDiff($firstDate,$secondDate);    
?>
Obaidul Haque
sumber
1
$diff = strtotime('2019-11-25') - strtotime('2019-11-10');
echo abs(round($diff / 86400));
premkumar
sumber
2
Selamat datang di SO! Ketika Anda membalas posting dengan kode yang adil, tolong jelaskan sedikit. Kode yang Anda bawa dihitung antara 2019-11-10 dan 2019-11-25. Jadi itu tidak menjawab pertanyaan. Itu sebabnya bagus untuk menjelaskan POV Anda lebih baik daripada downvoted.
David García Bodego
0

Jika Anda menggunakan MySql

function daysSince($date, $date2){
$q = "SELECT DATEDIFF('$date','$date2') AS days;";
$result = execQ($q);
$row = mysql_fetch_array($result,MYSQL_BOTH);
return ($row[0]);

}

function execQ($q){
$result = mysql_query( $q);
if(!$result){echo ('Database error execQ' . mysql_error());echo $q;}    
return $result;

}

pengguna462990
sumber
0

Coba gunakan Karbon

$d1 = \Carbon\Carbon::now()->subDays(92);
$d2 = \Carbon\Carbon::now()->subDays(10);
$days_btw = $d1->diffInDays($d2);

Anda juga bisa menggunakannya

\Carbon\Carbon::parse('')

untuk membuat objek tanggal Karbon menggunakan string cap waktu yang diberikan.

Shriganesh Shintre
sumber
Bisakah Anda jelaskan apa perbedaan antara ini dan jawaban saya?
Arda
1
Untuk melakukan perbedaan tanggal yang sederhana, Anda sarankan untuk menyertakan seluruh paket baru?
tomazahlin
0

Mencari semua jawaban, saya menulis fungsi universal yang berfungsi pada semua versi PHP.

if(!function_exists('date_between')) :
    function date_between($date_start, $date_end)
    {
        if(!$date_start || !$date_end) return 0;

        if( class_exists('DateTime') )
        {
            $date_start = new DateTime( $date_start );
            $date_end   = new DateTime( $date_end );
            return $date_end->diff($date_start)->format('%a');
        }
        else
        {           
            return abs( round( ( strtotime($date_start) - strtotime($date_end) ) / 86400 ) );
        }
    }
endif;

Secara umum, saya menggunakan 'DateTime' untuk menemukan hari antara 2 tanggal. Tetapi jika dalam beberapa alasan, beberapa pengaturan server tidak mengaktifkan 'DateTime', itu akan menggunakan perhitungan sederhana (tetapi tidak aman) dengan 'strtotime ()'.

Ivijan Stefan Stipic
sumber