2013-01-23 12 views
14

की पुनरावृत्ति की गणना करें मैं समझता हूं कि एक अपवाद के साथ दिनांक अवधि कैसे काम करती है, क्या तारीख अवधि से पता लगाने का कोई तरीका है कि कितने अंतराल हैं?PHP दिनांक अवधि()

उदाहरण के लिए

तो:

echo count($period); 

मूल रूप से मुझे पता है कि कितने समय foreach पाश चल खत्म हो जाएगा चाहते हैं:

// define the period of the range 
$period = new DatePeriod($begin, $rangeType, $end); 

// iterate through the dates in range 
foreach ($period as $dt) { 
} 

यह मैं ऊपर कोड से करना चाहते हैं क्या है ।

उत्तर

22

आप इस के लिए iterator_count फ़ंक्शन का उपयोग कर सकते हैं:

echo(iterator_count($period)); 
+5

ध्यान दें कि 'iterator_count' आंतरिक रूप से उन्हें गिनने के लिए सभी वस्तुओं पर पुनरावृत्त करता है। तो यदि अवधि बड़ी है और आप इसे किसी भी तरह से आगे बढ़ाते हैं तो आप खुद को गिनती कर सकते हैं, जो अधिक कुशल होगा। –

-2
class MyDatePeriod extends DatePeriod 
{ 
    public $dates; 

    public function toArray() 
    { 
     if ($this->dates === null) { 
      $this->dates = iterator_to_array($this); 
     } 

     return $this->dates; 
    } 
} 

$p = new MyDatePeriod(date_create('2008-01-01'), 
         DateInterval::createFromDateString("+2 days"), 
         date_create('2008-12-31')); 

echo count($p->toArray()) . "\n"; // 183 

echo count($p->toArray()) . "\n"; // 183 
+0

नहीं ... यदि आपको इसे विरासत के साथ हल करना है, तो कम से कम जटिलताओं की बजाय 'गणना योग्य' इंटरफ़ेस को कम से कम कार्यान्वित करें। लेकिन किसी भी तरह से, डेटपेरियोड का विस्तार करना बुरा अभ्यास है। –

+2

मानक पुस्तकालयों का विस्तार करना एक बुरा अभ्यास है? सभी चीजें इलेक्ट्रॉनिक बस विस्फोट हुआ। – David

+0

हां, * कार्यक्षमता जोड़ने के लिए * कक्षाओं को विस्तारित करना आमतौर पर एक बुरा विचार है। देखें [विरासत पर संरचना] (http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance) (या [यहां] (http://en.wikipedia.org/wiki/Composition_over_inheritance) या [यहां ] (http://c2.com/cgi/wiki?CompositionInsteadOfInheritance)। यहां एक साफ विकल्प एक [सजावट] है (http://en.wikipedia.org/wiki/Decorator_pattern) क्योंकि यह स्वतंत्र रूप से कई कार्यक्षमता जोड़ने की अनुमति देगा। लेकिन इस विशिष्ट मामले के लिए जो ओवर-इंजीनियरिंग होगा। 'Iterator_count' और 'iterator_to_array' अच्छी तरह से काम करते हैं। –

1

यह मानते हुए कि आप केवल (चाहे अंतराल कल्पना की) दिनों की संख्या की गणना में रुचि रखते हैं - लाने के लिए THX @ मार्क-Amery यह उपर!

एक और अधिक स्पष्ट दृष्टिकोण 2 तिथियों को अलग करना होगा और परिणाम से दिनों की संख्या प्राप्त होगी।

$numDays = $end->diff($begin)->days; 
$numDaysFormatted = $end->diff($begin)->format('%d days'); 

अपने GET मान्य करने के लिए सुनिश्चित करें तारीख चेतावनी/त्रुटियों से बचने के वार्स। से

बेहतर देर से कभी नहीं ;-)

संपादित करें:

आप केवल एक अवधि वस्तु आरंभ और अवधि के अंत के लिए उपयोग किया करते है।

$numDays = $period 
    ->getEndDate() 
    ->diff($period->getStartDate()) 
    ->days; 
+0

-1; यह मानता है कि 'डेटपीरियोड' का 1 दिन 'दिनांक अंतराल' है, जिसकी आवश्यकता नहीं है। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^