เปรียบเทียบวันที่ที่ระบุกับวันนี้


216

ฉันมีดังต่อไปนี้

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

ฉันต้องการเปรียบเทียบวันที่นี้กับวันที่ของวันนี้ (เช่นฉันต้องการทราบว่านี่$varคือก่อนวันนี้หรือเท่ากับวันนี้หรือไม่)

ฉันจำเป็นต้องใช้ฟังก์ชั่นอะไร


5
ฉันอยากจะแนะนำให้ตั้งเขตเวลา
NJInamdar

คำตอบ:


289
strtotime($var);

เปลี่ยนเป็นค่าเวลา

time() - strtotime($var);

ให้วินาทีกับคุณ $var

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

จะตรวจสอบว่า$varได้รับภายในวันสุดท้าย


1
สำหรับ php 4 ออกจาก '.0' สุดท้ายจาก $ var = "2010-01-21 00: 00: 00.0" มิฉะนั้น strtotime จะส่งกลับ -1
vivoconunxino

1
ฉันใช้ PHP 7.1 ส่วนที่สองจะถูกละเว้นเพียงแค่ให้ผลตอบแทนเป็นจำนวนเต็มกับจำนวนวินาที
Diogo Melo

209

รูปแบบนั้นเหมาะสมอย่างยิ่งสำหรับการเปรียบเทียบสตริงมาตรฐานเช่น

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

date("Y-m-d H:i:s")ที่จะได้รับวันที่วันนี้ในรูปแบบที่เพียงแค่ใช้:

ดังนั้น:

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

if ($date < $today) {}

นั่นคือความงามของรูปแบบนั้น: มันสั่งได้อย่างดี แน่นอนว่าอาจมีประสิทธิภาพน้อยกว่าทั้งนี้ขึ้นอยู่กับสถานการณ์ที่แน่นอนของคุณ แต่อาจสะดวกกว่ามากและนำไปสู่รหัสที่รักษาได้มากขึ้น - เราต้องรู้มากขึ้นเพื่อทำการเรียกการตัดสินนั้น

สำหรับเขตเวลาที่ถูกต้องคุณสามารถใช้ตัวอย่างเช่น

date_default_timezone_set('America/New_York');

คลิกที่นี่เพื่ออ้างถึงเขตเวลา PHP ที่มีอยู่


2
สิ่งนี้จะไม่สนใจเขตเวลาด้วย
anushr

@anushr หากต้องการเขตเวลาในการเปรียบเทียบสามารถเพิ่มความแตกต่างของเวลาเป็นวันที่ก่อนทำการเปรียบเทียบ นี่ยังเร็วกว่าการแปลงสตริงเวลาสองวันในmm/dd/yyyyรูปแบบเป็นวันที่แล้วจึงทำการเปรียบเทียบ มันทำให้ฉันกังวลเสมอเมื่อนักพัฒนามีวันที่ในหลายเขตเวลาในระบบของพวกเขา ฉันคิดว่าการเก็บวันที่ในระบบของคุณจะดีกว่าเสมอในเขตเวลาเดียวแล้วแสดงในเขตเวลาใดก็ได้ที่ต้องการ ฉันเริ่มใช้yyyy-mm-ddรูปแบบ (หรือyyyymmdd) ประมาณปี 1998 เมื่อฉันรู้ว่ามันเรียงลำดับเร็วขึ้นมากแม้ในเซิร์ฟเวอร์ SQL
AaA

59

ไปเลย:

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

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

นอกจากนี้ฟังก์ชั่นตัวช่วยเพิ่มเติม:

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

function isFuture($time)
{
    return (strtotime($time) > time());
}

ทำไมตรรกะย้อนหลังแปลกและบูลีนนอกโลก? ทำไมไม่ใช่แค่ "return strtotime ($ time) == strtotime ('today')", "return strtotime ($ time)> time ()" และ "return strtotime ($ time) <time ()"
บ๊อบบี้แจ็ค

@ บ๊อบบี้แจ็ค: ฉันมีฟังก์ชั่นเพิ่มเติมในฟังก์ชั่นเหล่านั้นลืมที่จะลบรหัสพิเศษ แก้ไขแล้ว
Alix Axel

+1 ในฟังก์ชั่นตัวช่วยโดยเฉพาะคือ fast b / c ฉันเพิ่งรัน a if(strtotime('2013-01-22 00:00:00.00') < time()){....}และนั่นก็ทำเพื่อฉัน
MDMoore313

47

ในการทำ BoBby Jack ให้สมบูรณ์การใช้ DateTime OBject ถ้าคุณมี php 5.2.2+:

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

}

สิ่งนี้ไม่ถูกต้อง หาก $ var เป็นวันที่ปัจจุบัน (หลังเที่ยงคืนที่แน่นอน) DateTime ใหม่ () จะใหญ่กว่านั้น DateTime ใหม่ ($ var) และไม่ใช่ $ var ที่แท้จริงก่อนวันนี้
dxvargas

46

คุณสามารถใช้DateTimeคลาส:

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

ผู้ประกอบการเปรียบเทียบทำงาน *:

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)

นอกจากนี้ยังเป็นไปได้ที่จะดึงค่าการประทับเวลาจากวัตถุ DateTime และเปรียบเทียบ:

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)

* โปรดทราบว่า===ผลตอบแทนที่ผิดพลาดเมื่อเปรียบเทียบสองวัตถุ DateTime ที่แตกต่างกันแม้ว่าพวกเขาจะเป็นตัวแทนของวันที่เดียวกัน


$futureได้กลายเป็นอดีต : P
mbomb007

เวลาของฉันบินไปไหน
Salman

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

นั่นไม่ใช่สิ่งที่ฉัน$varเท่ากับใน OP
alexus

1
และคุณต้องการ PHP> = 5.4 สำหรับ (new DateTime ()) -> format ('Ym-d');
webrama.pl

6

หนึ่งความระมัดระวังขึ้นอยู่กับประสบการณ์ของผมถ้าวัตถุประสงค์ของคุณเท่านั้นที่เกี่ยวข้องกับวันที่แล้วต้องระวังที่จะรวมถึงการประทับเวลา "2016-11-09"ตัวอย่างเช่นสมมติว่าในวันนี้คือ การเปรียบเทียบที่เกี่ยวข้องกับการประทับเวลาจะทำให้ตรรกะเป็นโมฆะที่นี่ ตัวอย่าง,

//  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.
}

รหัสข้างต้นดูเหมือนจะถูกต้อง แต่ถ้าเป็นวันที่คุณต้องการเปรียบเทียบเท่านั้นรหัสดังกล่าวไม่ใช่เหตุผลที่ถูกต้อง ทำไม? เนื่องจาก time () และ strtotime () จะมีการระบุเวลาด้วย นั่นคือแม้ว่าวันที่ทั้งคู่จะอยู่ในวันเดียวกัน แต่ความแตกต่างของเวลาจะมีความสำคัญ ลองพิจารณาตัวอย่างด้านล่าง:

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

เนื่องจากอินพุตเป็นสตริงวันที่ธรรมดาการใช้strtotime()บน$inputจะถือว่าเป็นเวลาเที่ยงคืนของ 2016-11-09 ดังนั้นการวิ่งtime()ทุกเวลาหลังเที่ยงคืนจะรักษาอยู่เสมอ$inputเหมือนอดีตแม้ว่าพวกเขาจะอยู่ในวันเดียวกันก็ตาม

ในการแก้ไขปัญหานี้คุณสามารถโค้ดได้เช่นนี้

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}

1
ฉันแน่ใจว่า OP พิจารณาสิ่งนี้และนั่นคือเหตุผลที่พวกเขารวม `00: 00: 00.0 'ในคำถามของพวกเขา
AaA

6

ไม่กี่ปีต่อมาฉันสังเกต Bobby Jack เป็นครั้งที่สองว่า 24 ชั่วโมงสุดท้ายไม่ใช่วันนี้ !!! และฉันประหลาดใจที่คำตอบนั้นได้รับการสนับสนุนอย่างมาก ...

หากต้องการเปรียบเทียบว่าวันที่ใดวันหนึ่งมีค่าน้อยกว่าเท่ากับหรือมากกว่าวันอื่นก่อนอื่นคุณต้องเปลี่ยน "ลง" เป็นวันเริ่มต้น กล่าวอีกนัยหนึ่งตรวจสอบให้แน่ใจว่าคุณกำลังพูดถึงเวลาเดียวกันทั้งสองวันในเวลา 00:00:00 สิ่งนี้สามารถทำได้อย่างเรียบง่ายและสง่างามเช่น:

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

ถ้า $varมีส่วนเวลาใน 00:00:00 เช่น OP ระบุ

แทนที่<=>ด้วยสิ่งที่คุณต้องการ (หรือเก็บไว้อย่างนี้ใน php 7)

เห็นได้ชัดว่าเรากำลังพูดถึงเขตเวลาเดียวกันสำหรับทั้งสอง สำหรับรายการของเขตเวลาที่รองรับ


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

(ตัวอย่าง w3schools มันใช้งานได้ดี)


4

ขยายคำตอบของโจชัวจาก 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';}

ฉันหวังว่านี่จะช่วยได้. โพสต์แรกของฉันใน stackoverflow!


1

เปรียบเทียบวัตถุเวลาวันที่:

(ฉันเลือก 10 วัน - สิ่งที่เก่ากว่า 10 วันคือ "OLD", "ใหม่")

$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');
}

1

บางคำตอบที่ได้รับไม่ได้พิจารณาวันปัจจุบัน

นี่คือข้อเสนอของฉัน

$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
}

0

หากคุณทำสิ่งที่มีเวลาและวันที่คาร์บอนเป็นเพื่อนที่ดีที่สุดของคุณ;

ติดตั้งแพคเกจแล้ว:

$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 = น้อยกว่า, gt = มากกว่า

ดังเช่นในคำถาม:

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

และอีกมากมาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.