मैं PHP में दो तिथियों की तुलना कैसे कर सकता हूं?


125

मैं PHP में दो तिथियों की तुलना कैसे कर सकता हूं?

दिनांक को डेटाबेस में निम्न प्रारूप में संग्रहीत किया जाता है

2011/10/02

यदि मैं डेटाबेस में तारीख के खिलाफ आज की तारीख की तुलना करना चाहता हूं, तो यह देखने के लिए कि कौन अधिक है, मैं यह कैसे करूंगा?

मैंने यह कोशिश की,

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

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

लेकिन यह वास्तव में उस तरह से काम नहीं करता है। इसे करने का दूसरा तरीका क्या है?


किसी दिनांक समय ऑब्जेक्ट के लिए db दिनांक असाइन करें और फिर उन ऑब्जेक्ट्स की तुलना करें। आप 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
@ डावो, तुलना पहले चरित्र पर रुकती है जो अलग है। इस स्थिति में, '1' <'2' का चौथा अंक है, इसलिए आपको वह परिणाम मिलता है जिसकी आप अपेक्षा करते हैं।
मैथ्यू

1
मुझे क्षमा करें :), पर्याप्त सावधानी नहीं थी।
डीएवी

निम्नलिखित काम करेंगे 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 1970केवल विंडोज पर चलने वाले PHP के पुराने संस्करणों के बारे में चिंता लागू होती है और यह यूनिक्स पर कभी कोई समस्या नहीं थी।
एल्वारो गोंजालेज

मुझे यह उत्तर पसंद है। यह एक बढ़िया विकल्प है जो तिथियों को स्ट्रेटोटाइम () में परिवर्तित करता है
Erich García

2
क्या अब यह नहीं होगा "यदि आपकी सभी तिथियां 1 9 70 की जनवरी से पहले की हैं" और "पिछले 2038 से पहले"? हमारे y2k38 बग के लिए देखें। strtotimeबड़ी तारीखों के लिए झूठी वापसी करेगा। stackoverflow.com/questions/2012589/…
blamb

ध्यान दें कि 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; 
}

अद्यतन: या साधारण उपयोग पुराने स्कूल की तारीख () समारोह:

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

1
तिथि एक फ़ंक्शन है, न कि एक क्लास / कंस्ट्रक्टर।
स्पेडियोनिस

2
@spdionis टिप्पणी के लिए धन्यवाद, मैंने संभावित भ्रम को दूर करने के लिए कैपिटल पत्र को बदल दिया।
d.raev

6

मैं PHP के साथ ऐसा नहीं करेगा। एक डेटाबेस को पता होना चाहिए कि आज कौन सा दिन है। (उदाहरण के लिए MySQL-> Now () का उपयोग करें), इसलिए क्वेरी के भीतर तुलना करना और परिणाम वापस करने के लिए बहुत आसान होगा, बिना उपयोग की तारीखों के आधार पर किसी भी समस्या के बिना।

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

धन्यवाद, लेकिन मैं वास्तव में तारीख का उपयोग करता हूं () मैं एक डीबी में आज की तारीख को स्टोर नहीं करता
सरमन बी।

4
लेकिन आप एक db में expireDate को स्टोर करते हैं। अब ()
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 तारीखों की तुलना करने के लिए पूछ रहा है - आपका उत्तर अतिरिक्त सामान का लोड जोड़ रहा है (यानी ऑनलाइन / ऑफ़लाइन स्थिति सेट करना) जो प्रश्न के उत्तर के रूप में आवश्यक नहीं है। आपके उत्तर का वह भाग जहाँ तुलनाएँ होती हैं, वस्तुतः यहाँ पहले से मौजूद उत्तर के समान है
क्रेज़ीलॉबिन

प्रश्न का अद्यतन किया, मैंने गलत प्रश्न में गलत उत्तर पोस्ट किया ^ ^;) यह उत्तर के समान नहीं है, बस मेरे इनपुट को जोड़ने के लिए कि उनकी तुलना कैसे करें और मिनटों में अंतर प्राप्त करें।
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; 
}

इस तकनीक के कार्यों को उत्तर में क्यों समझाया जाना चाहिए।
मिकमैकुसा

कृपया ओपी के पोस्ट किए गए प्रश्न का उत्तर दें, न कि आपने अपने स्वयं के अनूठे परिदृश्य को कैसे हल किया।
मिकमैकुसा

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 तारीखों के बीच के दिन मिलेंगे।


यह एक अलग समस्या को हल करता प्रतीत होता है। कृपया केवल ओपी द्वारा पूछे गए प्रश्न का उत्तर दें।
मिकमैकुसा

-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

यहाँ सबूत है कि आपकी तकनीक आज की तारीख के खिलाफ ओपी की तारीखों की सही तुलना करने में विफल रहेगी
mickmackusa

ओपी का एक अलग दिनांक प्रारूप है। दिनांक जैसा दिखता है 2011-10-2
मिकमैकुसा

-1

यदि आप एक तिथि ($ तिथि) चाहते हैं, तो पासवर्ड रीसेट करते समय एक टोकन समाप्ति तिथि उदाहरण के लिए कुछ अंतराल में समाप्त हो जाती है, यहां बताया गया है कि आप कैसे कर सकते हैं:

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

यह उत्तर मूल रूप से पोस्ट किए गए प्रश्न की अनदेखी कर रहा है। कृपया ओपी द्वारा प्रदान किए गए सैंपल डेटा का उपयोग करें।
मिकमैकुसा

यह बिल्कुल वैसा नहीं है जैसा आदमी मदद मांग रहा है, लेकिन मुझे लगा कि अगर कोई सिद्धांतों को समझता है तो यह मदद कर सकता है।
faye.babacar78

मैं सिद्धांतों को समझता हूं, लेकिन यह कोड पूछे गए सवाल का जवाब नहीं देता है। यह पृष्ठ पहले से ही गलत और असंबंधित उत्तरों से फूला हुआ है - यह केवल शोधकर्ताओं को भ्रमित करता है और उनका समय बर्बाद करता है। मैं शोधकर्ताओं के लिए बाहर देखने की कोशिश कर रहा हूं।
मिकमैकुसा

वैसे मुझे लगता है कि यह मुश्किल नहीं है, वह डेट () फ़ंक्शन के बजाय डेटटाइम () वर्ग का उपयोग कर सकता है। शोधकर्ताओं ने विचारों को देने के लिए जो उत्तर दिया है वह किसी भी तरह से है।
faye.babacar78

1
मैं खुद को दोहराना बंद कर दूंगा और इस चर्चा को खत्म करूंगा। दूसरा उच्चतम समाधान ( stackoverflow.com/a/3847762/2943403 ) दो डेटाटाइम ऑब्जेक्ट बनाने का एक बहुत ही सरल (अपराजेय) तरीका दिखाता है। मुझे बिल्कुल पता नहीं है कि आपकी जादुई requestDate()विधि क्या करती है - कहीं भी इसका कोई उल्लेख नहीं है। मैं आपके उत्तर का उपयोग नहीं करूंगा, और न ही कोई शोधकर्ता आपके समाधान का उपयोग करने की सलाह देगा। मैं अपने वोट को बदलने के लिए खुद को दूर नहीं करता हूं।
मिकमैकुसा

-2

सबसे पहले, अपने सर्वर की वर्तमान तिथि समय के लिए इच्छित प्रारूप देने का प्रयास करें:

  1. वर्तमान दिनांक समय प्राप्त करें

    $ current_date = getdate ();

  2. अपनी इच्छानुसार उन्हें प्रबंधित करने के लिए अलग दिनांक और समय:

$ current_date_only = $ current_date [वर्ष] .'- '। $ current_date [mon] .'-' $ current_date [mday]; $ current_time_only = $ current_date ['घंटे']। ':'। $ current_date ['मिनट']] ':'। $ current_date ['सेकंड'];

  1. यदि आप अपने DB में दान तिथि या डेटाटाइम का उपयोग कर रहे हैं, तो इसकी तुलना करें:

    $ आज = ​​$ current_date_only। ' '$ Current_time_only।

    या

    $ आज = ​​$ current_date_only;

    अगर ($ आज <$ expireDate)

आशा करता हूँ की ये काम करेगा


यह उत्तर मूल प्रश्न को हल करने का कोई प्रयास नहीं करता है। ओपी को घंटे, मिनट या सेकंड में कोई दिलचस्पी नहीं है।
मिकमैकुसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.