Bandingkan tanggal tertentu dengan hari ini

216

Saya sudah mengikuti

$var = "2010-01-21 00:00:00.0"

Saya ingin membandingkan tanggal ini dengan tanggal hari ini (yaitu saya ingin tahu apakah ini $var sebelum hari ini atau sama dengan hari ini atau tidak)

Fungsi apa yang harus saya gunakan?

alexus
sumber
5
Saya akan menyarankan untuk mengatur zona waktu juga
NJInamdar

Jawaban:

289
strtotime($var);

Mengubahnya menjadi nilai waktu

time() - strtotime($var);

Memberi Anda detik sejak $var

if((time()-(60*60*24)) < strtotime($var))

Akan memeriksa apakah $vartelah dalam hari terakhir.

Tyler Carter
sumber
1
untuk php 4 keluar dari '.0' terakhir dari $ var = "2010-01-21 00: 00: 00.0", jika tidak strtotime akan mengembalikan -1
vivoconunxino
1
Saya menggunakan PHP 7.1. Bagian subsecond hanya diabaikan, mengingat pengembaliannya adalah bilangan bulat dengan jumlah detik.
Diogo Melo
208

Format itu sangat cocok untuk perbandingan string standar misalnya

if ($date1 > $date2){
  //Action
}

Untuk mendapatkan tanggal hari ini dalam format itu, cukup gunakan: date("Y-m-d H:i:s") .

Begitu:

$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";

if ($date < $today) {}

Itulah keindahan format itu: ia memesan dengan baik. Tentu saja, itu mungkin kurang efisien, tergantung pada keadaan Anda yang sebenarnya, tetapi mungkin juga jauh lebih nyaman dan mengarah pada kode yang lebih dapat dipertahankan - kita perlu tahu lebih banyak untuk benar-benar membuat keputusan penilaian itu dilakukan.

Untuk zona waktu yang benar, Anda dapat menggunakan, misalnya,

date_default_timezone_set('America/New_York');

Klik di sini untuk merujuk ke Zona Waktu PHP yang tersedia.

Bobby Jack
sumber
2
Ini juga mengabaikan zona waktu
anushr
@ anushr, jika zona waktu diperlukan sebagai perbandingan, perbedaan waktu dapat ditambahkan ke tanggal sebelum membandingkan. Ini masih lebih cepat daripada mencoba mengonversi dua string waktu tanggal dalam mm/dd/yyyyformat ke tanggal dan kemudian membandingkannya. Itu selalu mengkhawatirkan saya ketika pengembang memiliki tanggal di beberapa zona waktu di sistem mereka. Saya pikir lebih baik menyimpan tanggal di sistem Anda, selalu dalam zona waktu tunggal dan kemudian menampilkannya di zona waktu apa pun yang diperlukan. Saya mulai menggunakan yyyy-mm-ddformat (atau yyyymmdd) sekitar tahun 1998 ketika saya menyadari itu jauh lebih cepat bahkan dalam SQL server.
AaA
59

Ini dia:

function isToday($time) // midnight second
{
    return (strtotime($time) === strtotime('today'));
}

isToday('2010-01-22 00:00:00.0'); // true

Juga, beberapa fungsi pembantu lainnya:

function isPast($time)
{
    return (strtotime($time) < time());
}

function isFuture($time)
{
    return (strtotime($time) > time());
}
Alix Axel
sumber
Mengapa logika mundur aneh dan boolean asing? Mengapa tidak hanya "mengembalikan strtotime ($ time) == strtotime ('today')", "return strtotime ($ time)> time ()", dan "return strtotime ($ time) <time ()"?
Bobby Jack
@Obby Jack: Saya memiliki lebih banyak fungsi di fungsi-fungsi itu, lupa menghapus kode tambahan. Diperbaiki sekarang
Alix Axel
+1 pada fungsi helper, khususnya isPast b / c Saya baru saja menjalankan if(strtotime('2013-01-22 00:00:00.00') < time()){....}dan itu melakukannya untuk saya.
MDMoore313
47

Untuk menyelesaikan BoBby Jack, gunakan DateTime OBject, jika Anda memiliki php 5.2.2+:

if(new DateTime() > new DateTime($var)){
    // $var is before today so use it

}
kamakazuu
sumber
Ini tidak benar. Jika $ var adalah hari ini (setelah tengah malam tepat), DateTime baru () akan lebih besar maka DateTime baru ($ var) dan itu tidak benar $ var sebelum hari ini.
dxvargas
46

Anda bisa menggunakan DateTimekelas:

$past   = new DateTime("2010-01-01 00:00:00");
$now    = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");

Operator perbandingan berfungsi *:

var_dump($past   < $now);         // bool(true)
var_dump($future < $now);         // bool(false)

var_dump($now == $past);          // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future);        // bool(false)

var_dump($past   > $now);         // bool(false)
var_dump($future > $now);         // bool(true)

Dimungkinkan juga untuk mengambil nilai cap waktu dari objek DateTime dan membandingkannya:

var_dump($past  ->getTimestamp());                        // int(1262286000)
var_dump($now   ->getTimestamp());                        // int(1431686228)
var_dump($future->getTimestamp());                        // int(1577818800)
var_dump($past  ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)

* Catatan yang ===mengembalikan false ketika membandingkan dua objek DateTime yang berbeda bahkan ketika mereka mewakili tanggal yang sama.

Salman A
sumber
$futuretelah menjadi masa lalu. : P
mbomb007
Wah, betapa cepatnya waktu berlalu.
Salman A
13
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');

var_dump(strtotime($today) > strtotime($expiry)); //false or true
Hassan
sumber
itu tidak $varsama dengan saya di OP
alexus
1
Dan Anda memerlukan PHP> = 5.4 untuk (DateTime baru ()) -> format ('Ym-d');
webrama.pl
6

Satu peringatan berdasarkan pengalaman saya, jika tujuan Anda hanya melibatkan kencan maka berhati-hatilah untuk memasukkan cap waktu . Sebagai contoh, katakanlah hari ini "2016-11-09". Perbandingan yang melibatkan cap waktu akan membatalkan logika di sini. Contoh,

//  input
$var = "2016-11-09 00:00:00.0";

//  check if date is today or in the future
if ( time() <= strtotime($var) ) 
{
    //  This seems right, but if it's ONLY date you are after
    //  then the code might treat $var as past depending on
    //  the time.
}

Kode di atas tampaknya benar, tetapi jika HANYA tanggal yang ingin Anda bandingkan, maka kode di atas bukan logika yang benar. Mengapa? Karena, waktu () dan strtotime () akan memberikan termasuk stempel waktu. Artinya, meskipun kedua tanggal jatuh pada hari yang sama, tetapi perbedaan waktu akan menjadi masalah. Perhatikan contoh di bawah ini:

//  plain date string
$input = "2016-11-09";

Karena inputnya adalah string tanggal sederhana, penggunaan strtotime()pada $inputakan menganggap bahwa itu tengah malam 2016-11-09. Jadi, berlari time()kapan saja setelah tengah malam akan selalu menyenangkan$input masa lalu, meskipun mereka pada hari yang sama.

Untuk memperbaikinya, Anda cukup kode, seperti ini:

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}
Lynnell Emmanuel Neri
sumber
1
Saya yakin OP mempertimbangkan hal ini dan itulah mengapa mereka memasukkan `
00:00
6

Beberapa tahun kemudian, saya kedua pengamatan Bobby Jack bahwa 24 jam terakhir bukan hari ini !!! Dan saya terkejut bahwa jawabannya sangat terangkat ...

Untuk membandingkan jika suatu tanggal tertentu kurang, sama atau lebih besar dari yang lain, pertama-tama Anda harus mengubahnya "turun" ke awal hari. Dengan kata lain, pastikan Anda berbicara tentang waktu yang sama 00:00:00 di kedua tanggal. Ini bisa dilakukan dengan sederhana dan elegan sebagai:

strtotime("today") <=> strtotime($var)

jika $varmemiliki bagian waktu pada 00:00:00 seperti OP yang ditentukan.

Ganti <=>dengan apa pun yang Anda butuhkan (atau simpan seperti ini di php 7)

Juga, jelas, kita berbicara tentang zona waktu yang sama untuk keduanya. Untuk daftar Zona Waktu yang didukung

Nelu Bidonelu
sumber
5
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);

(contoh w3schools, ini berfungsi dengan sempurna)

Richard de Ree
sumber
4

Memperluas jawaban Josua dari w3schools:

//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0)  {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}

Saya harap ini membantu. Posting pertama saya di stackoverflow!

enceladus
sumber
1

Bandingkan objek waktu tanggal:

(Saya memilih 10 hari - Apa pun yang lebih dari 10 hari adalah "TUA", atau "BARU")

$now   = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
    echo "OLD! " . $yourdate->format('m/d/Y');
}else{
    echo "NEW! " . $yourdate->format('m/d/Y');
}
Kevin
sumber
1

Beberapa jawaban yang diberikan tidak mempertimbangkan hari ini!

Ini proposal saya.

$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);

if ($given_date == new \DateTime('today')) {
  //today
}

if ($given_date < new \DateTime('today')) {
  //past
}

if ($given_date > new \DateTime('today')) {
  //future
}
dxvargas
sumber
0

Jika Anda melakukan hal-hal dengan waktu dan tanggal Karbon adalah teman baik Anda;

Instal paketnya kemudian:

$theDay = Carbon::make("2010-01-21 00:00:00.0");

$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))

lt = kurang dari, gt = lebih besar dari

Seperti dalam pertanyaan:

$theDay->gt(Carbon::today()) ? true : false;

dan banyak lagi;

Lucas M. Oliveira
sumber