मेरे पास PHP में 2 तिथियाँ हैं, मैं उन सभी दिनों से गुजरने के लिए एक फ़ॉरच लूप कैसे चला सकता हूं?


207

मैं एक तारीख से शुरू कर रहा हूं 2010-05-01और समाप्त कर रहा हूं 2010-05-10। मैं PHP में उन सभी तिथियों के माध्यम से कैसे पुनरावृति कर सकता हूं?

जवाबों:


535

PHP5.3 की आवश्यकता है:

$begin = new DateTime('2010-05-01');
$end = new DateTime('2010-05-10');

$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);

foreach ($period as $dt) {
    echo $dt->format("l Y-m-d H:i:s\n");
}

यह सभी दिनों के बीच $startऔर निर्धारित अवधि में आउटपुट करेगा $end। यदि आप 10 वीं को शामिल करना चाहते हैं, तो $end11 वीं तक सेट करें। आप अपनी पसंद के अनुसार प्रारूप को समायोजित कर सकते हैं। DatePeriod के लिए PHP मैनुअल देखें ।


2
अच्छी खबर - अंतिम तिथि को शामिल करने के लिए एक झंडा स्थापित करने के लिए एक पैच है (उंगलियों को पार) इसे भविष्य के संस्करण में बना देगा।
सालथे

8
$begin->setTime(0,0); $end->setTime(12,0);या प्रारंभ तिथि के दिन के समय के साथ आरंभ करने की समाप्ति तिथि की तुलना में बाद में किसी भी समय लूप में अंतिम तिथि शामिल होगी। सबसे स्टाइलिश फिक्स नहीं है, लेकिन यह सबसे अच्छा विकल्प है जब तक कि एक उचित झंडा न हो।
क्रिस

31
यदि आप अंतिम तिथि को अपने अंतराल में शामिल करना चाहते हैं, तो आप कर सकते हैं: $ end = $ end-> संशोधित ('+1 दिन');
जुलियनटैड

3
क्या इतिहास में इसका उपयोग करना संभव है लेकिन इसे उल्टा करना, इतिहास में वापस लाना है?
जॉन

3
@ जुलियनटार्ड एक बहुत अच्छा विचार है, लेकिन अधिक सुरुचिपूर्ण $ अंत होगा-> जोड़ ($ अंतराल) क्योंकि यह सीधे एक बदले हुए अंतराल पर प्रतिक्रिया करता है;)
GDY

92

इसमें अंतिम तिथि भी शामिल है

$begin = new DateTime( "2015-07-03" );
$end   = new DateTime( "2015-07-09" );

for($i = $begin; $i <= $end; $i->modify('+1 day')){
    echo $i->format("Y-m-d");
}

यदि आपको अंतिम तिथि की आवश्यकता नहीं है तो बस =शर्त को हटा दें ।


1
ध्यान दें कि लूप के बाद अलग$begin होगा । यह लूप द्वारा बनाई गई वस्तु को संशोधित करता है । इसलिए आप DateTimeImmutable संस्करणों का उपयोग क्यों करना चाहिए। लेकिन आपको उनका उपयोग करने के लिए कुछ और संशोधनों की आवश्यकता है। new DateTime( "2015-07-03" )
हेंक पोली

40

यूनिक्स टाइमस्टैम्प में बदलने से php में तारीख गणित करना आसान हो जाता है:

$startTime = strtotime( '2010-05-01 12:00' );
$endTime = strtotime( '2010-05-10 12:00' );

// Loop between timestamps, 24 hours at a time
for ( $i = $startTime; $i <= $endTime; $i = $i + 86400 ) {
  $thisDate = date( 'Y-m-d', $i ); // 2010-05-01, 2010-05-02, etc
}

डीएसटी वाले टाइमज़ोन के साथ पीएचपी का उपयोग करते समय, ऐसे समय को जोड़ना सुनिश्चित करें जो स्किपिंग या दोहराए जाने वाले दिनों से बचाने के लिए 23:00, 00:00 या 1:00 नहीं है।


4
मुझे वह 86400 का लुक पसंद नहीं है। मैं समझता हूं कि यह 60 * 60 * 24 है, लेकिन फिर भी ... इसके बारे में कुछ मुझे परेशान करता है।
माइकड जूल Mike

13
इस मामले में, यह काम करता है, लेकिन अगर सामान्य और धूप की बचत समय के बीच एक स्विच होता है, तो यह विफल हो जाएगा क्योंकि एक 90000 दूसरे दिन है कि आप दो बार अपने पाश में होंगे ...
oezi

2
माइक, सबसे अच्छी बात यह है कि एक स्थिर सेटअप है और इसे "डीएवाई" नाम दें ताकि इसे पढ़ना आसान हो जाए।
पिक्सेल डेवलपर

5
यह दिन के उजाले बचत मुद्दों से पीड़ित होगा। जब आप एक दिन की बचत समय बिंदु को पार करते हैं, तो यह खराब हो जाएगा। समय के बिंदु पर दोनों ओर से 12:00 पूर्वाह्न 12:00 नहीं है।
एरिक कोप

1
यह कोड करता है (प्रति दिन 86400 सेकंड के साथ प्रत्येक कोड) को डेलाइट सेविंग की समस्या है! दिन के उजाले के साथ कुछ दिन केवल 23 घंटे और कुछ 25 घंटे तक चलते हैं।
sbrbot

20

समावेशी रेंज के लिए php.net नमूने से कॉपी :

$begin = new DateTime( '2012-08-01' );
$end = new DateTime( '2012-08-31' );
$end = $end->modify( '+1 day' ); 

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);

foreach($daterange as $date){
    echo $date->format("Ymd") . "<br>";
}

यह सबसे अच्छा और सबसे पूर्ण उत्तर है। केवल DateInterval मान P1D का कुछ स्पष्टीकरण याद आ रहा है, इसलिए यहां कुछ अवधि डिज़ाइनर उदाहरण दो दिन हैं: P2D दो सेकंड: PT2S एक सप्ताह और दस मिनट: P1WT10M Y सालों से M के लिए महीनों D से हफ्तों तक W। ये दिनों में परिवर्तित हो जाते हैं, इसलिए डी। एच। के साथ घंटों के लिए नहीं जोड़ा जा सकता है M मिनटों के लिए S पर सेकंड के लिए
Orcra

15
$startTime = strtotime('2010-05-01'); 
$endTime = strtotime('2010-05-10'); 

// Loop between timestamps, 1 day at a time 
$i = 1;
do {
   $newTime = strtotime('+'.$i++.' days',$startTime); 
   echo $newTime;
} while ($newTime < $endTime);

या

$startTime = strtotime('2010-05-01'); 
$endTime = strtotime('2010-05-10'); 

// Loop between timestamps, 1 day at a time 
do {
   $startTime = strtotime('+1 day',$startTime); 
   echo $startTime;
} while ($startTime < $endTime);

2
ऐसा प्रतीत होता है कि यह समाधान स्वीकृत उत्तर की तुलना में धीमा है (संयुक्त रूप से कुछ बेंच चलाए गए: 60 पुनरावृत्तियों के लिए 100% धीमा)। लेकिन मैं पुराने होस्टिंग प्लेटफॉर्म के लिए रेट्रो संगतता के लिए इसे चुनता हूं।
Ifnot

7

यहाँ एक और सरल है -

/**
 * Date range
 *
 * @param $first
 * @param $last
 * @param string $step
 * @param string $format
 * @return array
 */
function dateRange( $first, $last, $step = '+1 day', $format = 'Y-m-d' ) {
    $dates = [];
    $current = strtotime( $first );
    $last = strtotime( $last );

    while( $current <= $last ) {

        $dates[] = date( $format, $current );
        $current = strtotime( $step, $current );
    }

    return $dates;
}

उदाहरण:

print_r( dateRange( '2010-07-26', '2010-08-05') );

Array (
    [0] => 2010-07-26
    [1] => 2010-07-27
    [2] => 2010-07-28
    [3] => 2010-07-29
    [4] => 2010-07-30
    [5] => 2010-07-31
    [6] => 2010-08-01
    [7] => 2010-08-02
    [8] => 2010-08-03
    [9] => 2010-08-04
    [10] => 2010-08-05
)

5

उपयोगकर्ता इस समारोह: -

function dateRange($first, $last, $step = '+1 day', $format = 'Y-m-d' ) {
                $dates = array();
                $current = strtotime($first);
                $last = strtotime($last);

                while( $current <= $last ) {    
                    $dates[] = date($format, $current);
                    $current = strtotime($step, $current);
                }
                return $dates;
        }

उपयोग / फ़ंक्शन कॉल: -

एक दिन बढ़ाएँ: -

dateRange($start, $end); //increment is set to 1 day.

माह से वृद्धि: -

dateRange($start, $end, "+1 month");//increase by one month

यदि आप दिनांक प्रारूप सेट करना चाहते हैं तो तीसरे पैरामीटर का उपयोग करें: -

   dateRange($start, $end, "+1 month", "Y-m-d H:i:s");//increase by one month and format is mysql datetime

2

यहाँ एक तरीका है:

 $date = new Carbon();
 $dtStart = $date->startOfMonth();
 $dtEnd = $dtStart->copy()->endOfMonth();

 $weekendsInMoth = [];
 while ($dtStart->diffInDays($dtEnd)) {

     if($dtStart->isWeekend()) {
            $weekendsInMoth[] = $dtStart->copy();
     }

     $dtStart->addDay();
 }

$ सप्ताहांत का परिणाम है। दोनों सप्ताहांत दिनों की सरणी है!


0
$date = new DateTime($_POST['date']);
$endDate = date_add(new DateTime($_POST['date']),date_interval_create_from_date_string("7 days"));

while ($date <= $endDate) {
    print date_format($date,'d-m-Y')." AND END DATE IS : ".date_format($endDate,'d-m-Y')."\n";
    date_add($date,date_interval_create_from_date_string("1 days"));
}

आप इसे इस तरह से भी टाइप कर सकते हैं, $_POST['date']आपके ऐप या वेबसाइट से सेंध लगाई जा सकती है , इसके बजाय $_POST['date']आप यहां अपना स्ट्रिंग भी रख सकते हैं "21-12-2019"। दोनों काम करेंगे।


0

यदि आप लारवेल का उपयोग करते हैं और कार्बन का उपयोग करना चाहते हैं तो सही समाधान निम्नलिखित होगा:

$start_date = Carbon::createFromFormat('Y-m-d', '2020-01-01');
$end_date = Carbon::createFromFormat('Y-m-d', '2020-01-31');

$period = new CarbonPeriod($start_date, '1 day', $end_date);

foreach ($period as $dt) {
 echo $dt->format("l Y-m-d H:i:s\n");
}

जोड़ना याद रखें:

  • कार्बन \ कार्बन का उपयोग करें;
  • कार्बन \ CarbonPeriod का उपयोग करें;

0
<?php

    $start_date = '2015-01-01';
    $end_date = '2015-06-30';

    while (strtotime($start_date) <= strtotime($end_date)) {
        echo "$start_daten";
        $start_date = date ("Y-m-d", strtotime("+1 days", strtotime($start_date)));
    }

?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.