2012-01-04 14 views
6

मैं 2 दिनांकों के बीच अंतर की तुलना करने के कोशिश कर रहा था परिणाम, लेकिन ऐसा लगता परिणाम बहुत गलत, इस कोड हैं उदाहरण के लिए:पीएचपी: Datetime :: Diff तुलना

$datetime1 = new DateTime('2009-10-11'); 
$datetime2 = new DateTime('2009-10-13'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%R%a days')."<br />"; 

$datetime1 = new DateTime('2009-10-11'); 
$datetime2 = new DateTime('2009-10-15'); 
$interval2 = $datetime1->diff($datetime2); 
echo $interval2->format('%R%a days')."<br />"; 

if($interval == $interval2){ echo "true"; }else{echo "false"; } 

रिटर्न सच है, लेकिन आप कर सकते हैं इसके बाद के संस्करण देखें कि मतभेद समान नहीं हैं, वास्तव में गूंज प्रिंट +2 और +4। 2 दिनांक मतभेदों की तुलना करने के तरीके में कोई विचार?

संपादित करें: जवाब के लिए दिनांक :: diff, एक dateinterval वस्तु देता है, वास्तव में यह तुलना ऑपरेटरों को लागू नहीं करता है, https://bugs.php.net/bug.php?id=49914 मैं अंतर की जांच करने के dateinterval वार्स इस्तेमाल करेंगे धन्यवाद

+1

वस्तु तुलना =/= मूल्य तुलना। – hakre

उत्तर

7

ऐसा लगता है कि दिनांक अंतराल आंतरिक रूप से तुलनात्मक कार्य को लागू नहीं करता है। एक्सटेंशन को अपनी पूर्वनिर्धारित कक्षाओं के लिए कस्टम तुलना नियमों को परिभाषित करने की अनुमति है। जाहिर है, यह एक ढीली तुलना में वापस आ जाता है कि वस्तुएं एक ही कक्षा के हैं।

This feature request इस कार्यक्षमता को जोड़ने के लिए एक पैच प्रदान करता है, लेकिन ऐसा लगता है कि यह किसी भी समय स्रोत में नहीं बना है।

इस समस्या के समाधान के लिए, आप अपने वस्तुओं के प्रत्येक सदस्य चर तुलना या तो कर सकते हैं अपने आप को (वर्ष, महीने आदि) या आप एक सरणी के लिए प्रत्येक वस्तु डाली कर सकते हैं:

if ((array) $interval == (array) $interval2) { 
    echo 'true'; 
} else { 
    echo 'false'; 
} 
0

आप बताए जाते हैं $ datetime1-> diff ($ datetime2) दोनों $ अंतराल और $ अंतराल 2 तक, इसलिए उनके पास समान मान

+0

आप देख सकते हैं कि लाइन 7 पर मैंने तिथि बदल दी है;) – alex88

3

आप केवल comparing that the two objects­Docs समान प्रकार (और प्रोप के समान मूल्य) हैं, लेकिन यह नहीं कि वे हैं समान:

if ($interval === $interval2) {echo "true";} else {echo "false";} 
       ^^^ 

ध्यान दें, कि आप ऑब्जेक्ट तुलना कर रहे हैं, एक स्ट्रिंग के साथ मूल्य तुलना नहीं।

+0

ओह, आप सही हैं, धन्यवाद! – alex88

+0

प्रति [ऑब्जेक्ट तुलना] (http://php.net/manual/en/language.oop5.object-comparison.php), उसी प्रकार के ऑब्जेक्ट्स को उसी सार्वजनिक सदस्य चर के साथ बराबर माना जाना चाहिए; यह सुनिश्चित नहीं है कि यह पूर्वनिर्धारित कक्षाओं पर भरोसेमंद रूप से कैसे लागू होता है। – cmbuckley

+0

@cbuckley: * "नोट: एक्सटेंशन उनके ऑब्जेक्ट तुलना के लिए अपने नियमों को परिभाषित कर सकते हैं।" * - तो सब कुछ हो सकता है;) – hakre

0

मुझे याद है कि इस तरह php में तिथियों की तुलना करने के लिए एक फ़ंक्शन है।

compare_dates($start_date,$end_date); 
+3

नहीं, –

+0

नहीं है यह नहीं मिला:/ – alex88

+0

आपका कोड http://php.net/manual/en/datetime.diff.php से लिया गया है उसी साइट पर, आपको तुलना_डेट्स सिंटैक्स यहां मिलेगा http://php.net/manual/en/ref.datetime.php – Anil

0

मैं दोनों के बीच तुलना की निम्न प्रकार का उपयोग करके डेटइंटरवल्स:

version_compare(join('.', (array) $dateIntervalA), join('.', (array) $dateIntervalB)); 
+2

मैं उस फ़ंक्शन का दुरुपयोग नहीं करता जो दिनांक अंतराल की तुलना करने के लिए संस्करण टैग की तुलना करता है। – Sven

2

मैंने PHP वर्ग बढ़ाया है। विधि तुलना मूल्य तुलना करता है। यह php DateInterval कक्षा में चर के "प्राकृतिक" क्रम का उपयोग करता है। Foreach चक्र पहले साल, महीनों, फिर दिन, आदि के माध्यम से चला जाता है। यह शायद एक बहुत पोर्टेबल समाधान नहीं है, लेकिन ऐसा लगता है कि यह PHP 5.3 में ठीक काम कर रहा है।

/** 
* Description of DateInterval 
* 
* @author Santhos 
*/ 
class DateInterval extends \DateInterval 
{  
    /** 
    * compares two date intervals 
    * returns: 
    * 0 - when they are equal 
    * less than zero - $a is less than $b 
    * greater than zero - $a is greater than $b 
    * 
    * @param \Designeo\Utils\DateInterval $dateInterval 
    * @return int 
    */ 
    public static function compare($a, $b) 
    { 
     // check parameters 
     self::isDateInterval($a); 
     self::isDateInterval($b); 

     foreach ($a as $key => $value) {    
      // after seconds 's' comes 'invert' and other crap we do not care about 
      // and it means that the date intervals are the same 
      if ($key == 'invert') {     
       return 0; 
      } 

      // when the values are the same we can move on 
      if ($a->$key == $b->$key) { 
       continue; 
      } 

      // finally a level where we see a difference, return accordingly 
      if ($a->$key < $b->$key) { 
       return -1; 
      } else { 
       return 1; 
      } 
     } 
    } 

    private static function isDateInterval($object) 
    { 
     if (!is_a($object, 'DateInterval')) { 
      throw new \Exception('Parameter dateInterval type has to be a Dateinterval.'); 
     } 
    } 

    public function compareToAnother($dateInterval) { 
     return self::compare($this, $dateInterval); 
    } 
} 
संबंधित मुद्दे