আমার পিএইচপি-তে 2 টি তারিখ রয়েছে, সেই সমস্ত দিনগুলিতে যাওয়ার জন্য আমি কীভাবে ফোরচ লুপ চালাতে পারি?


207

আমি একটি তারিখ দিয়ে শুরু করছি 2010-05-01এবং শেষ করছি 2010-05-10। আমি কীভাবে পিএইচপি-তে এই সমস্ত তারিখের মাধ্যমে পুনরাবৃত্তি করতে পারি?

উত্তর:


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 তম সেট করুন। আপনি আপনার পছন্দ অনুসারে বিন্যাস সামঞ্জস্য করতে পারেন। ডেটপিয়ারডের জন্য পিএইচপি ম্যানুয়াল দেখুন ।


2
সুসংবাদ - সমাপ্তির তারিখ অন্তর্ভুক্ত করার জন্য পতাকা নির্ধারণের জন্য একটি প্যাচ রয়েছে যা (আঙ্গুলগুলি অতিক্রম করে) এটি ভবিষ্যতের সংস্করণে পরিণত করবে।
সালাতে

8
$begin->setTime(0,0); $end->setTime(12,0);বা শেষ তারিখের চেয়ে পরে যে কোনও সময় হিসাবে শুরু হওয়ার তারিখের দিনের সাথে সূচনা করে লুপের শেষের তারিখটি অন্তর্ভুক্ত করবে। সর্বাধিক স্টাইলিশ ফিক্স নয়, তবে যতক্ষণ না সঠিক পতাকা নেই ততক্ষণ এটি সর্বোত্তম বিকল্প।
ক্রিস

31
আপনি যদি আপনার বিরতিতে শেষের তারিখটি অন্তর্ভুক্ত করতে চান তবে আপনি এটি করতে পারেন: $ end = $ end-> সংশোধন করুন ('+1 দিন');
জুলিয়ানাইটার্ড

3
ইতিহাসে ফিরে আসা কি এটিকে ব্যবহার করে তবে এটির বিপরীত হওয়া সম্ভব?
জন

3
@ জুলিয়ানিটার্ড একটি দুর্দান্ত ধারণা পোষণ করেছেন তবে আরও মার্জিত হবে $ শেষ-> অ্যাড ($ বিরতি) কারণ এটি সরাসরি পরিবর্তিত ব্যবধানে সাড়া দেয়;)
জিডিওয়াই

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 হবে তা নিশ্চিত হয়ে নিন । এই লুপ দ্বারা নির্মিত বস্তুটি পরিবর্তন করে । সুতরাং আপনাকে কেন ডেটটাইমআইএমটিউটেবল সংস্করণগুলি ব্যবহার করা উচিত। তবে এগুলি ব্যবহারের জন্য আপনার আরও কিছু পরিবর্তন প্রয়োজন। new DateTime( "2015-07-03" )
হেন্ক পোলি

40

ইউনিক্স টাইমস্ট্যাম্পে রূপান্তরিত করা পিএইচপি তে তারিখের গণিতকে আরও সহজ করে তোলে:

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

ডিএসটি থাকা টাইমজোন সহ পিএইচপি ব্যবহার করার সময়, এমন কোনও সময় যুক্ত করতে ভুলবেন না যা ২৩:২০, 00:00 বা 1:00 সময় বাদ না দিয়ে বা পুনরাবৃত্তি থেকে রক্ষা করতে।


4
আমি 86400 এর চেহারা পছন্দ করি না I আমি বুঝতে পারি যে এটি 60 * 60 * 24, তবে এখনও ... এটি সম্পর্কে কিছু আমাকে বিরক্ত করে।
মাইকড

13
এই ক্ষেত্রে, এটি কার্যকর হয়, তবে যদি স্বাভাবিক এবং সূর্যের আলো সাশ্রয়ের
সময়টির

2
মাইক, করণীয় সেরা কাজটি একটি ধ্রুবক সেটআপ করা হয় এবং এর নামকরণ "DAY" হয় তাই এটি পড়া সহজ হয়।
পিক্সেল বিকাশকারী

5
এটি দিবালোকের সঞ্চয় সংক্রান্ত সমস্যায় ভুগবে। আপনি যখন কোনও দিবালোক সঞ্চয় সময় পয়েন্টটি অতিক্রম করবেন তখন এটি খারাপ হবে। সময় অনুযায়ী পয়েন্টের দুপাশে সকাল 12:00 টা নয়।
এরিক কোপ

1
এই কোডটি (প্রতিদিন 86400 সেকেন্ড সহ প্রতিটি কোড) দিবালোক সংরক্ষণে সমস্যা আছে! দিবালোক সংরক্ষণের সাথে কিছু দিন কেবল ২৩ ঘন্টা এবং কিছুটা 25 ঘন্টা অবধি থাকে।
sbrbot

20

অন্তর্ভুক্ত ব্যাপ্তির জন্য পিএইচপি.এন.পি. নমুনা থেকে অনুলিপি করুন :

$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>";
}

এটি সেরা এবং সবচেয়ে সম্পূর্ণ উত্তর complete কেবলমাত্র ডেটইন্টারওয়াল মান পি 1 ডি এর কিছু ব্যাখ্যা অনুপস্থিত, সুতরাং এখানে কিছু পিরিয়ড ডিজাইনার উদাহরণ দুটি দিন: পি 2 ডি দুই সেকেন্ড: পিটি 2 এস এক সপ্তাহ এবং দশ মিনিট: পি 1 ডাব্লু 10 টাস এম বছরের কয়েক মাস ডি ডি জন্য সপ্তাহের জন্য ড। এগুলি দিনগুলিতে রূপান্তরিত হয়, সুতরাং ডি এইচ এর সাথে কয়েক ঘন্টার জন্য কয়েক মিনিট এস সেকেন্ডের জন্য
মিশ্রিত করা

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
দেখা যাচ্ছে যে এই সমাধানটি গৃহীত উত্তরের চেয়ে ধীর ( তবে আমি পুরানো হোস্টিং প্ল্যাটফর্মগুলির জন্য রেট্রো সামঞ্জস্যের জন্য এটি বেছে নিই।
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");
}

যোগ করতে মনে রাখবেন:

  • কার্বন ব্যবহার করুন \ কার্বন;
  • কার্বন \ কার্বনপ্রিয়ড ব্যবহার করুন;

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)));
    }

?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.