Bagaimana saya bisa membandingkan dua tanggal dalam PHP?


125

Bagaimana saya bisa membandingkan dua tanggal dalam PHP?

Tanggal disimpan dalam database dengan format berikut

2011-10-2

Jika saya ingin membandingkan tanggal hari ini dengan tanggal di database untuk melihat mana yang lebih besar, bagaimana cara melakukannya?

Saya mencoba ini,

$today = date("Y-m-d");
$expire = $row->expireDate //from db

if($today < $expireDate) { //do something; }

tapi sebenarnya tidak seperti itu. Apa cara lain untuk melakukannya?


Tetapkan tanggal db ke objek DateTime dan kemudian bandingkan objek tersebut. Anda dapat menemukan contoh yang bagus di stackoverflow.com/questions/961074/…
Peter

Jawaban:


80

dalam database tanggal terlihat seperti ini 2011-10-2

Simpan dalam YYYY-MM-DD dan kemudian perbandingan string akan berfungsi karena '1'> '0', dll.


2
tetapi bagaimana jika mereka terlihat seperti ini, 2011-10-02 dan 2012-02-10, untuk perbandingan bulan 1> 0, tetapi 2011-10-02 <2012-02-10
dav

14
@Davo, perbandingan berhenti pada karakter pertama yang berbeda. Dalam hal ini, digit keempat dari '1' <'2', jadi Anda mendapatkan hasil yang Anda harapkan.
Matius

1
Maaf :), kurang hati-hati.
dav

akankah pekerjaan berikut ini 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00?
shorif2000

221

Jika semua tanggal Anda posterior tanggal 1 Januari 1970, Anda dapat menggunakan sesuatu seperti:

$today = date("Y-m-d");
$expire = $row->expireDate; //from database

$today_time = strtotime($today);
$expire_time = strtotime($expire);

if ($expire_time < $today_time) { /* do Something */ }

Jika Anda menggunakan PHP 5> = 5.2.0, Anda dapat menggunakan kelas DateTime:

$today_dt = new DateTime($today);
$expire_dt = new DateTime($expire);

if ($expire_dt < $today_dt) { /* Do something */ }

Atau sesuatu seperti ini.


Jika saya ingat dengan benar, kekhawatiran tentang 1st of January of 1970hanya berlaku untuk versi lama PHP yang berjalan di Windows dan tidak pernah menjadi masalah di Unix.
Álvaro González

Saya suka jawaban ini. Ini adalah pilihan yang bagus untuk mengubah tanggal menjadi strtotime ()
Erich García

2
Bukankah sekarang menjadi "Jika semua tanggal Anda posterior tanggal 1 Januari 1970" dan "sebelum 2038"? perhatikan bug y2k38 kami. strtotimeakan mengembalikan false untuk tanggal yang lebih besar. stackoverflow.com/questions/2012589/…
blamb

Perhatikan bahwa DateTimemetode tersebut adalah metode yang disukai. Objek itu dapat melakukan lebih dari yang strtotimepernah bisa dilakukan.
Machavity

new DateTime('now')juga bekerja untuk mengambil tanggal hari ini
Breith

23

Sekadar memuji jawaban yang sudah diberikan, lihat contoh berikut:

$today = new DateTime('');
$expireDate = new DateTime($row->expireDate); //from database



if($today->format("Y-m-d") < $expireDate->format("Y-m-d")) { 
    //do something; 
}

Perbarui: Atau gunakan fungsi tanggal sekolah tua () sederhana :

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   

1
Tanggal adalah fungsi, bukan kelas / konstruktor.
spdionis

2
@spdionis terima kasih atas komentarnya, saya mengubah huruf kapital untuk menghilangkan kemungkinan kebingungan.
d.raev

6

Saya tidak akan melakukan ini dengan PHP. Database harus tahu, hari apa hari ini. (Gunakan MySQL-> NOW () misalnya), sehingga akan sangat mudah untuk membandingkan dalam Query dan mengembalikan hasilnya, tanpa masalah tergantung pada Jenis Tanggal yang digunakan

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName

terima kasih tetapi saya benar-benar menggunakan tanggal () saya tidak menyimpan tanggal hari ini di db
Sarmen B.Okt

4
Tapi Anda menyimpan expireDate dalam db. Bandingkan tanggal ini dengan SEKARANG ()
Dr. Molle

4
$today = date('Y-m-d');//Y-m-d H:i:s
$expireDate = new DateTime($row->expireDate);// From db 
$date1=date_create($today);
$date2=date_create($expireDate->format('Y-m-d'));
$diff=date_diff($date1,$date2);

//echo $timeDiff;
if($diff->days >= 30){
    echo "Expired.";
}else{
    echo "Not expired.";
}

2

Berikut cara untuk mengetahui perbedaan antara dua tanggal dalam hitungan menit.

// set dates
$date_compare1= date("d-m-Y h:i:s a", strtotime($date1));
// date now
$date_compare2= date("d-m-Y h:i:s a", strtotime($date2));

// calculate the difference
$difference = strtotime($date_compare1) - strtotime($date_compare2);
$difference_in_minutes = $difference / 60;

echo $difference_in_minutes;

Pertanyaannya adalah menanyakan untuk membandingkan 2 tanggal - jawaban Anda menambahkan banyak hal tambahan (yaitu menyetel status online / offline) yang tidak diperlukan sebagai jawaban atas pertanyaan. Bagian jawaban Anda di mana perbandingan terjadi hampir sama dengan jawaban yang sudah ada di sini .
crazyloonybin

Memperbarui pertanyaan, saya memposting jawaban yang salah di pertanyaan yang salah ^^;) Ini tidak sama dengan jawaban, hanya menambahkan masukan saya tentang cara membandingkan dan mendapatkan perbedaan dalam hitungan menit.
Syno

1
Saya telah menghapus downvote saya karena pembaruan Anda, terlihat jauh lebih baik sekarang :)
crazyloonybin

2

Anda dapat mengubah tanggal menjadi stempel waktu UNIX dan membandingkan perbedaannya dalam hitungan detik.

$today_date=date("Y-m-d");
$entered_date=$_POST['date'];
$dateTimestamp1 = strtotime($today_date);
$dateTimestamp2 = strtotime($entered_date);
$diff= $dateTimestamp1-$dateTimestamp2;
//echo $diff;
if ($diff<=0)
   {
     echo "Enter a valid date";
   }

0

Saya memiliki masalah itu juga dan saya menyelesaikannya dengan:

$today = date("Ymd");
$expire = str_replace('-', '', $row->expireDate); //from db

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}

Mengapa teknik ini berhasil harus dijelaskan dalam jawaban.
mickmackusa

Harap jawab pertanyaan OP yang diposting, bukan bagaimana Anda memecahkan skenario unik Anda sendiri.
mickmackusa

0

Inilah putaran saya tentang cara mendapatkan perbedaan hari antara dua tanggal dengan PHP. Perhatikan penggunaan '!' dalam format untuk membuang bagian waktu dari tanggal, berkat info dari DateTime createFromFormat tanpa waktu .

$today = DateTime::createFromFormat('!Y-m-d', date('Y-m-d'));
$wanted = DateTime::createFromFormat('!d-m-Y', $row["WANTED_DELIVERY_DATE"]);
$diff = $today->diff($wanted);
$days = $diff->days;
if (($diff->invert) != 0) $days = -1 * $days;
$overdue = (($days < 0) ? true : false);
print "<!-- (".(($days > 0) ? '+' : '').($days).") -->\n";

-1

Temukan jawabannya di blog dan sesederhana itu:

strtotime(date("Y"."-01-01")) -strtotime($newdate))/86400

Dan Anda akan mendapatkan hari-hari di antara 2 tanggal tersebut.


Ini tampaknya memecahkan masalah yang berbeda. Mohon hanya menjawab pertanyaan yang diajukan oleh OP.
mickmackusa

-1

Ini berfungsi karena logika perbandingan string PHP. Cukup Anda dapat memeriksa ...

if ($startdate < $date) {// do something} 
if ($startdate > $date) {// do something}

Kedua tanggal harus dalam format yang sama. Digit harus diisi nol ke kiri dan diurutkan dari yang paling signifikan hingga paling tidak signifikan. Y-m-ddan Y-m-d H:i:smemenuhi kondisi ini.


1
d-m-Ytidak akan bekerja .. Y-m-d(dengan nol seperti 2016-05-08) akan bekerja. Periksa tanggal-tanggal tersebut dalam d-m-Yformat 01-10-2016dan 20-02-2016, bandingkan sebagai string 0 <2, itu akan berhenti membandingkan tetapi salah ...
Arxeiss

Berikut adalah bukti bahwa teknik Anda akan gagal untuk membandingkan tanggal OP dengan tanggal hari ini: 3v4l.org/SNHKT
mickmackusa

OP memiliki format tanggal yang berbeda. sepertinya tanggalnya 2011-10-2.
mickmackusa

-1

Jika Anda ingin tanggal ($ date) kedaluwarsa dalam beberapa interval misalnya tanggal kedaluwarsa token saat melakukan pengaturan ulang kata sandi, berikut cara Anda melakukannya:

$date = $row->expireDate;

$date->add(new DateInterval('PT24H')); // adds 24 hours

$now = new \DateTime();

if($now < $date) { /* expired after 24 hours */ }

Tetapi dalam kasus Anda, Anda dapat melakukan perbandingan seperti berikut:

$today = new DateTime('Y-m-d');

$date = $row->expireDate;

if($today < $date) { /* do something */ }

Jawaban ini mengabaikan pertanyaan asli yang diposting. Silakan gunakan data sampel yang disediakan oleh OP.
mickmackusa

Ini tidak persis apa yang pria itu meminta bantuan tetapi saya pikir cara ini bisa membantu jika seseorang memahami prinsip-prinsipnya.
faye.babacar78

Saya memahami prinsip-prinsipnya, tetapi kode ini tidak menjawab pertanyaan yang diajukan. Halaman ini penuh dengan jawaban yang salah dan tidak berhubungan - ini hanya membingungkan peneliti dan membuang-buang waktu mereka. Saya mencoba mencari para peneliti.
mickmackusa

Yah saya pikir itu tidak terlalu sulit, dia bisa menggunakan kelas DateTime () daripada fungsi date (). Jawaban yang saya berikan di atas adalah untuk memberikan ide kepada para peneliti.
faye.babacar78

1
Saya akan berhenti mengulangi diri saya sendiri dan melepaskan diri dari diskusi ini. Solusi tertinggi ke-2 ( stackoverflow.com/a/3847762/2943403 ) menunjukkan cara yang sangat sederhana (tidak terkalahkan) untuk membuat dua objek datetime. Saya sama sekali tidak tahu apa requestDate()yang dilakukan metode magis Anda - tidak ada yang menyebutkannya di mana pun. Saya tidak akan menggunakan jawaban Anda, atau menyarankan peneliti manapun untuk menggunakan solusi Anda. Saya tidak melihat diri saya mengubah pilihan saya.
mickmackusa

-2

pertama-tama, coba berikan format yang Anda inginkan ke waktu tanggal saat ini dari server Anda:

  1. Dapatkan waktu tanggal sekarang

    $ current_date = getdate ();

  2. Pisahkan tanggal dan waktu untuk mengelolanya sesuai keinginan:

$ current_date_only = $ current_date [tahun] .'- '. $ current_date [mon] .'-'. $ current_date [mday]; $ current_time_only = $ current_date ['jam']. ':'. $ current_date ['menit']. ':'. $ current_date ['detik'];

  1. Bandingkan itu tergantung jika Anda menggunakan tanggal atau waktu donly di DB Anda:

    $ today = $ current_date_only. ' '. $ current_time_only;

    atau

    $ hari ini = $ current_date_only;

    if ($ today <$ expireDate)

semoga membantu


Jawaban ini tidak berusaha menjawab pertanyaan asli. OP tidak tertarik pada jam, menit, atau detik.
mickmackusa
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.