ฉันจะเปรียบเทียบวันที่สองวันใน PHP ได้อย่างไร


125

ฉันจะเปรียบเทียบวันที่สองวันใน PHP ได้อย่างไร

วันที่จะถูกเก็บไว้ในฐานข้อมูลในรูปแบบต่อไปนี้

2011/10/02

หากฉันต้องการเปรียบเทียบวันที่ของวันนี้กับวันที่ในฐานข้อมูลเพื่อดูว่าวันใดมากกว่าฉันจะทำอย่างไร

ฉันลองแล้ว

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

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

แต่มันไม่ได้ผลจริงๆ มีวิธีอื่นในการทำอย่างไร


กำหนดวันที่ฐานข้อมูลให้กับวัตถุ DateTime แล้วเปรียบเทียบวัตถุเหล่านั้น คุณสามารถค้นหาตัวอย่างที่ดีในstackoverflow.com/questions/961074/…
ปีเตอร์

คำตอบ:


80

ในฐานข้อมูลวันที่มีลักษณะเช่นนี้ 2011-10-2

เก็บไว้ใน YYYY-MM-DD จากนั้นการเปรียบเทียบสตริงจะใช้งานได้เพราะ "1"> "0" เป็นต้น


2
แต่ถ้าพวกเขามีลักษณะเช่นนี้ 2011-10-02 และ 2012-02-10 สำหรับการเปรียบเทียบเดือน 1> 0 แต่ 2011-10-02 <2012-02-10
dav

14
@Davo การเปรียบเทียบหยุดที่อักขระตัวแรกที่แตกต่างกัน ในกรณีนี้ตัวเลขหลักที่สี่ของ '1' <'2' คุณจึงได้ผลลัพธ์ตามที่คาดหวัง
Matthew

1
ฉันขอโทษ :) ระมัดระวังไม่เพียงพอ
dav

ต่อไปนี้จะใช้ได้2016-03-27 11:59:47 ::: 2016-03-14 10:30:00ไหม
shorif2000

221

หากวันที่ทั้งหมดของคุณอยู่หลังวันที่ 1 มกราคม 1970 คุณสามารถใช้สิ่งต่อไปนี้

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

หากคุณใช้ PHP 5> = 5.2.0 คุณสามารถใช้คลาส DateTime:

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

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

หรือบางอย่างตามแนวเหล่านี้


ถ้าฉันจำได้ถูกต้องข้อกังวลเกี่ยวกับ1st of January of 1970PHP เวอร์ชันเก่าที่ทำงานบนWindows เท่านั้นและไม่เคยเป็นปัญหากับ Unix
ÁlvaroGonzález

ฉันชอบคำตอบนี้ เป็นทางเลือกที่ดีในการแปลงวันที่เป็น strtotime ()
Erich García

2
ตอนนี้จะเป็น "ถ้าวันที่ทั้งหมดของคุณอยู่หลังวันที่ 1 มกราคม 1970" และ "ก่อนหน้าถึงปี 2038" หรือไม่? ดูข้อผิดพลาด y2k38 ของเรา strtotimeจะส่งกลับเท็จสำหรับวันที่ใหญ่กว่า stackoverflow.com/questions/2012589/…
ตำหนิ

โปรดทราบว่าDateTimeวิธีนี้เป็นวิธีที่ต้องการ วัตถุนั้นสามารถทำได้มากกว่าที่strtotimeเคยทำได้
Machavity

new DateTime('now')ยังทำงานเพื่อดึงข้อมูลวันที่ของวันนี้
Breith

23

เพียงเพื่อชมเชยคำตอบที่ให้มาแล้วให้ดูตัวอย่างต่อไปนี้:

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



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

อัปเดต: หรือใช้ฟังก์ชันold-school date () :

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

1
วันที่เป็นฟังก์ชันไม่ใช่คลาส / ตัวสร้าง
spdionis

2
@spdionis ขอบคุณสำหรับความคิดเห็นฉันเปลี่ยนอักษรตัวใหญ่เพื่อขจัดความสับสนที่อาจเกิดขึ้น
d.raev

6

ฉันจะไม่ทำสิ่งนี้กับ PHP ฐานข้อมูลควรรู้ว่าวันนี้คือวันอะไร (ใช้ MySQL-> NOW () เป็นต้น) ดังนั้นการเปรียบเทียบในแบบสอบถามและส่งคืนผลลัพธ์จะเป็นเรื่องง่ายมากโดยไม่มีปัญหาใด ๆ ขึ้นอยู่กับประเภทวันที่ที่ใช้

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

ขอบคุณ แต่ฉันใช้วันที่จริง () ฉันไม่เก็บวันที่ของวันนี้ไว้ในฐานข้อมูล
Sarmen B.

4
แต่คุณเก็บ expireDate ไว้ใน db เปรียบเทียบวันนี้กับ NOW ()
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

นี่คือวิธีการสร้างความแตกต่างระหว่างวันที่สองวันในไม่กี่นาที

// 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;

คำถามคือการขอเปรียบเทียบวันที่ 2 วัน - คำตอบของคุณคือการเพิ่มสิ่งพิเศษมากมาย (เช่นการตั้งค่าสถานะออนไลน์ / ออฟไลน์) ซึ่งไม่จำเป็นสำหรับคำตอบสำหรับคำถาม ส่วนหนึ่งของคำตอบของคุณที่เปรียบเทียบจะใช้เวลาสถานที่เป็นจริงเช่นเดียวกับคำตอบที่มีอยู่แล้วที่นี่
crazyloonybin

อัปเดตคำถามฉันโพสต์คำตอบผิดในคำถามที่ไม่ถูกต้อง ^^;) มันไม่เหมือนกับคำตอบเพียงแค่เพิ่มข้อมูลของฉันเกี่ยวกับวิธีเปรียบเทียบและรับความแตกต่างในไม่กี่นาที
Syno

1
ฉันได้ลบการ
โหวตลงคะแนน

2

คุณสามารถแปลงวันที่เป็นการประทับเวลา UNIX และเปรียบเทียบความแตกต่างระหว่างวันเหล่านั้นในไม่กี่วินาที

$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

ฉันมีปัญหานั้นเช่นกันและฉันแก้ปัญหาโดย:

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

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

เหตุใดจึงควรอธิบายเทคนิคนี้ในคำตอบ
mickmackusa

โปรดตอบคำถามที่โพสต์ของ OP ไม่ใช่วิธีที่คุณแก้ไขสถานการณ์เฉพาะของคุณเอง
mickmackusa

0

นี่คือการหมุนของฉันเกี่ยวกับวิธีสร้างความแตกต่างในวันระหว่างสองวันด้วย PHP สังเกตการใช้ "!" ในรูปแบบที่จะทิ้งส่วนช่วงเวลาของวันขอบคุณข้อมูลจากDateTime createFromFormat โดยไม่ต้องเวลา

$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

พบคำตอบในบล็อกและทำได้ง่ายเพียง:

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

และคุณจะได้รับวันระหว่างวันที่ 2 วัน


ดูเหมือนว่าจะแก้ปัญหาอื่นได้ กรุณาตอบเฉพาะคำถามที่ OP ถามเท่านั้น
mickmackusa

-1

ใช้งานได้เนื่องจากตรรกะการเปรียบเทียบสตริงของ PHP คุณสามารถตรวจสอบ ...

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

วันที่ทั้งสองต้องอยู่ในรูปแบบเดียวกัน ตัวเลขจะต้องมีเบาะเป็นศูนย์ทางด้านซ้ายและเรียงลำดับจากนัยสำคัญที่สุดไปยังนัยสำคัญน้อยที่สุด Y-m-dและY-m-d H:i:sปฏิบัติตามเงื่อนไขเหล่านี้


1
d-m-Yจะไม่ทำงาน .. Y-m-d(โดยมีศูนย์นำหน้าเช่น 2016-05-08) จะทำงาน ตรวจสอบวันที่เหล่านั้นในd-m-Yรูปแบบ01-10-2016และ20-02-2016เปรียบเทียบเป็นสตริง 0 <2 มันจะหยุดเปรียบเทียบ แต่ไม่ถูกต้อง ...
Arxeiss

นี่คือข้อพิสูจน์ว่าเทคนิคของคุณจะไม่สามารถเปรียบเทียบวันที่ของ OP กับวันนี้ได้อย่างถูกต้อง: 3v4l.org/SNHKT
mickmackusa

OP มีรูปแบบวันที่ที่แตกต่างกัน วันที่มีลักษณะเหมือน 2011-10-2
mickmackusa

-1

หากคุณต้องการให้วันที่ ($ date) หมดอายุในบางช่วงเช่นวันหมดอายุโทเค็นเมื่อทำการรีเซ็ตรหัสผ่านคุณสามารถทำได้ดังนี้

$date = $row->expireDate;

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

$now = new \DateTime();

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

แต่ในกรณีของคุณคุณสามารถทำการเปรียบเทียบได้ดังต่อไปนี้:

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

$date = $row->expireDate;

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

คำตอบนี้ไม่สนใจคำถามที่โพสต์ไว้ในตอนแรก โปรดใช้ข้อมูลตัวอย่างที่ OP
mickmackusa

ไม่ใช่สิ่งที่ผู้ชายกำลังขอความช่วยเหลือ แต่ฉันคิดว่าวิธีนี้จะช่วยได้ถ้ามีคนเข้าใจหลักการ
faye.babacar78

ฉันเข้าใจหลักการ แต่รหัสนี้ไม่ตอบคำถามที่ถาม หน้านี้เต็มไปด้วยคำตอบที่ไม่ถูกต้องและไม่เกี่ยวข้องซึ่งทำให้นักวิจัยสับสนและเสียเวลา ฉันพยายามมองหานักวิจัย
mickmackusa

ฉันคิดว่ามันไม่ยากเลยเขาสามารถใช้คลาส DateTime () แทนฟังก์ชัน date () ได้ คำตอบที่ฉันใส่ไว้ข้างต้นคือการให้ความคิดแก่นักวิจัย
faye.babacar78

1
ฉันจะเลิกพูดซ้ำ ๆ ซาก ๆ และเลิกใช้การสนทนานี้ โซลูชันสูงสุดอันดับ 2 ( stackoverflow.com/a/3847762/2943403 ) แสดงวิธีการสร้างวัตถุเวลาวันที่และเวลาที่เรียบง่ายอย่างน่ากลัว ฉันไม่รู้ว่าrequestDate()วิธีวิเศษของคุณทำอย่างไร - ไม่มีการกล่าวถึงที่ใดเลย ฉันจะไม่ใช้คำตอบของคุณและไม่แนะนำให้นักวิจัยใช้วิธีแก้ปัญหาของคุณ ฉันไม่คาดว่าตัวเองจะเปลี่ยนการลงคะแนน
mickmackusa

-2

ก่อนอื่นลองกำหนดรูปแบบที่คุณต้องการให้กับวันที่เวลาปัจจุบันของเซิร์ฟเวอร์ของคุณ:

  1. รับวันที่เวลาปัจจุบัน

    $ current_date = getdate ();

  2. แยกวันและเวลาเพื่อจัดการตามที่คุณต้องการ:

$ current_date_only = $ current_date [ปี] .'- '. $ current_date [จันทร์] .'-'. $ current_date [mday]; $ current_time_only = $ current_date ['ชั่วโมง']. ':'. $ current_date ['minutes']. ':'. $ current_date ['seconds'];

  1. เปรียบเทียบขึ้นอยู่กับว่าคุณใช้ donly date หรือ datetime ใน DB ของคุณ:

    $ today = $ current_date_only ' ' $ current_time_only.

    หรือ

    $ today = $ current_date_only;

    ถ้า ($ วันนี้ <$ expireDate)

หวังว่ามันจะช่วยได้


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