2010-01-28 5 views
27

यदि मेरे पास प्रारंभ तिथि है (2009-02-01 कहें) और एक अंतिम तिथि (2010-01-01 कहें), मैं सीमा में सभी तिथियों (महीनों) के माध्यम से जाने के लिए लूप कैसे बना सकता हूं?PHP: किसी भी तिथि सीमा में सभी महीनों के माध्यम से लूप?

उत्तर

70

$start = $month = strtotime('2009-02-01'); 
$end = strtotime('2011-01-01'); 
while($month < $end) 
{ 
    echo date('F Y', $month), PHP_EOL; 
    $month = strtotime("+1 month", $month); 
} 

मन का प्रयास करें टिप्पणी http://php.net/manual/de/datetime.formats.relative.php

सापेक्ष माह मूल्यों महीनों है कि वे के माध्यम से पारित की लंबाई के आधार पर गणना कर रहे हैं। एक उदाहरण "+2 महीने 2011-11-30" होगा, जो "2012-01-30" उत्पन्न करेगा। यह नवंबर के कारण 30 दिनों की अवधि के कारण है, और दिसंबर में 31 दिनों की लंबाई है, जो कुल 61 दिनों का उत्पादन करती है।

PHP5.3 के रूप में आप http://www.php.net/manual/en/class.dateperiod.php

+0

मैंने इस स्निपेट की कोशिश की और यह ठीक से काम नहीं करता है। यदि आपकी प्रारंभ तिथि महीने का अंत है और अंतिम तिथि तीसरी महीने की शुरुआत है। उदाहरण के लिए: 2014-08-31 - 2014-10-01 – 3s2ng

+2

@ 3s2ng हाँ, लेकिन यह सापेक्ष समय प्रारूपों के लिए व्यवहार की उम्मीद है। मेरे उत्तर में अपडेट देखें। – Gordon

+0

याप जो यह करेगा। धन्यवाद। – 3s2ng

26

उदाहरण के DateTime, DateInterval और DatePeriod वर्ग संयोजन का उपयोग कर सकते हैं:

$start = new DateTime('2009-02-01'); 
$interval = new DateInterval('P1M'); 
$end = new DateTime('2011-01-01'); 
$period = new DatePeriod($start, $interval, $end); 

foreach ($period as $dt) { 
    echo $dt->format('F Y') . PHP_EOL; 
} 
2
$start = strtotime('2011-09-01'); 
$end = strtotime('2013-12-01'); 
while($start < $end) 
{ 
    echo date('F Y', $start) . '<br>'; 
    $start = strtotime("+1 month", $start); 
} 
1

मेरे पास एक तरीका है जिसके परिणामों में इष्टतम है:

$begin = new DateTime('2014-07-14'); 
$end = new DateTime('2014-08-01'); 
$end = $end->modify('+1 month'); 
$interval = DateInterval::createFromDateString('1 month'); 

$period = new DatePeriod($begin, $interval, $end); 

foreach($period as $dt) { 
    var_dump($dt->format("m")); 
} 

@Glavic

15

की विधि के लिए एक प्लस स्वीकृत उत्तर उचित तरीका नहीं है।

मैंने इस स्निपेट को आजमाया और यह ठीक से काम नहीं करता है। यदि आपकी प्रारंभ तिथि महीने का अंत है और अंतिम तिथि तीसरी महीने की शुरुआत है।

उदाहरण के लिए: 2014-08-31 - 2014-10-01

उम्मीद की जानी चाहिए।

  • अगस्त
  • सितम्बर
  • अक्टूबर

बेहतर समाधान है:

$start = new DateTime('2010-12-02'); 
$start->modify('first day of this month'); 
$end  = new DateTime('2012-05-06'); 
$end->modify('first day of next month'); 
$interval = DateInterval::createFromDateString('1 month'); 
$period = new DatePeriod($start, $interval, $end); 

foreach ($period as $dt) { 
    echo $dt->format("Y-m") . "<br>\n"; 
} 

संदर्भ: How to list all months between two dates

1

मैं स्वीकार किए जाते हैं जवाब की सादगी पसंद है, लेकिन 3s2ng के रूप में, यह हमेशा काम नहीं करता है। तो मैंने इसे इस तरह tweeked:

$start = strtotime('2009-02-01'); 
    $startmoyr = date('Y', $start) . date('m', $start); 
    $end = strtotime('2013-12-01'); 
    $endmoyr = date('Y', $end) . date('m', $end); 

    while ($startmoyr <= $endmoyr) { 
     echo date("F Y", $start) . "<br>"; 
     $start = strtotime("+1month", $start); 
     $startmoyr = date('Y', $start) . date('m', $start); 
    } 
संबंधित मुद्दे