2009-06-05 20 views
11

मेरे पास एक "ईवेंट" है जिसे हर महीने के उसी दिन निर्धारित करने की आवश्यकता होती है।अगले महीने, उसी दिन PHP

कहें कि आप 1 मई को प्रारंभ तिथि निर्धारित करते हैं, आपको 1 जून, 1 जुलाई को अगली घटनाएं मिलनी चाहिए। समस्या 31 की शुरुआत की तारीख के साथ आता है (अगले 30 या 28 के आधार पर समस्या हो सकती है महीने में)।

इस बात पर विचार करते हुए कि महीनों और वर्ष के आधार पर अलग-अलग दिनों (28, 30, 31) के साथ महीनों हैं ... इसे स्थापित करने का एक आसान तरीका क्या होगा? जोड़ने के लिए

$events = array() 

function nextmonth($date) { 
    return $date+(60*60*24*30); 
} 
$curr = $start; 
while($curr < $end) { 
    $events[ = $curr; 
    $curr = nextmonth($curr); 
} 

संपादित:

निम्नलिखित (और त्रुटिपूर्ण) nextmonth समारोह पर विचार मेरे लिए समस्या कैसे हल क्या किसी भी महीने के दिनों की संख्या है और इस प्रकार प्राप्त करने के लिए, है बस पर्याप्त, अगली इसी तारीख।

+0

कृपया कोड को बेहतर प्रारूपित करें, धन्यवाद! – JasonV

+0

मैं संघर्ष कर रहा हूँ !! – Guillermo

+1

मैं एक PHP dev नहीं हूं इसलिए बस कुछ संदर्भ जोड़ रहा हूं, आउटलुक डिफ़ॉल्ट महीने के अंतिम दिन का उपयोग करने के लिए डिफ़ॉल्ट है यदि निर्दिष्ट दिनांक उस महीने के लिए मान्य दिनांक नहीं है। क्या आपको सप्ताहांत और छुट्टियों को ध्यान में रखना होगा? – Venr

उत्तर

1

चूंकि महीने आकार में इतने भिन्न हैं, अगले महीने सेट करने का सबसे अच्छा तरीका कुछ ऐसा नहीं होगा: इस दिन, अगले महीने यह छोड़कर कि यह दिन अगले महीने मौजूद नहीं है।

उदाहरण:

June 5, 2009, next month would be July 5, 2009 
August 31, 2009, next month would be September 30, 2009 

या बस, strtotime("+1 month")

+0

हाँ, वहां जाता है .. लेकिन मेरे लिए समस्या, बस विचार की गई है, किसी भी महीने के दिनों की संख्या को हल करना है .. – Guillermo

+0

@ गुइलर्मो, आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। स्ट्रेटोटाइम ("+ 1 महीने"), सचमुच, इसका ख्याल रखता है। –

+0

यह वही है जो मैं करता हूं लेकिन: गूंज दिनांक ("वाई-एम-डी", स्ट्रेटोटाइम ("200 9-30-30 +1 महीने")); 200.03.02 – Guillermo

2

मैं php.net पर निम्नलिखित टिप्पणी पढ़ने की सलाह देते। strtotime() (php.net)

संपादित करें: अगला उत्तर उन लिंक के "सारांश" को देता है जो मैंने पोस्ट की गई सामग्री को समझने में सक्षम नहीं हैं।

+0

दिलचस्प लग रहा है .. अगर आप इसे यहां पोस्ट करेंगे, तो किसी और को यहां देखकर उसका जवाब प्राप्त करने का मौका मिलेगा .. – Guillermo

7

अद्यतन:

यह आपको उस माह में दिनों की संख्या दे देंगे:

echo date('t', $timestamp); 

देखें: date()

पुराना जवाब:

मैं एल्गोरिदम के बारे में निश्चित नहीं है जिसके बारे में आप सोच रहे हैं लेकिन मुझे विश्वास है कि यह हेल होगा आप पी:

echo date('d-M-y', strtotime('next month')); 
+0

+1 यही वह स्थिति है जो मैं इस स्थिति में करूँगा। – karim79

+2

स्ट्रेटोटाइम ("200 9-30-30 +1 महीने"); 2009.03.02 के रूप में हल हो जाता है मेरे मामले में उपयोगी नहीं – Guillermo

+0

@ गुइलर्मो, यदि आप 31 जनवरी से 28 फरवरी को मानचित्र करना चाहते हैं, तो 28 जनवरी से कौन सा दिन मेल खाता है? अभी भी 28 फरवरी? –

4

यह $ एक्स आने वाले महीनों के लिए उचित टाइमस्टैम्प वापस आ जाएगी: mktime(0,0,0,date("m")+$X,date('d'),date("Y"));

+0

+1 यह अधिक प्राकृतिक लगता है - तिथि को तोड़ें और जो चाहते हैं उसे प्राप्त करने के लिए घटकों को सामान जोड़ें। – Kekoa

+0

+1, मैंने इसका परीक्षण किया और यह ठीक काम करता है जब वर्तमान माह प्लस एक्स 12 से अधिक संख्या के बराबर होता है। यह वर्ष को सही ढंग से बढ़ाता है।इसके अलावा यदि माह में दिन की संख्या मौजूद नहीं है तो यह अगले महीने अतिरिक्त दिनों के साथ आगे बढ़ेगी। – gradbot

+1

ने आपके परीक्षण मामले "200 9 -30-30" +1 महीने का परीक्षण किया और यह 200-3-2 – gradbot

0

कैसे इस समारोह के बारे में:

function getNextMonthN($date, $n = 1) { 
     $newDate = strtotime('+' . $n . ' months', $date); 
     if (date('j', $date) !== (date('j', $newDate))) { 
     $newDate = mktime(0, 0, 0, date('n', $newDate), 0, date('Y', $newDate)); 
     } 
     return $newDate; 
    } 

तहत php.net मैनुअल साइट पर एक और समाधान भी नहीं है comments में स्ट्रेटोटाइम प्रविष्टि।

1

एक लार्क के रूप में इस की कोशिश की, और यह वास्तव में

strtotime('last day next month') 

तो काम करता है:

$today_next_month = strtotime('this day next month'); 
$last_day_next_month = strtotime('last day next month'); 
if (date('d', $today_next_month) < date('d', $last_day_next_month)){ 
    $date = date('m-d-Y', $last_day_next_month); 
} else { 
    $date = date('m-d-Y', $today_next_month); 
} 
echo "And the winner is : $date<br/>"; 
+0

मुझे कहना है, मुझे यह काम करने की उम्मीद नहीं थी। लेकिन, यह किया था! –

0

कोई नहीं है इस विकल्प का उल्लेख किया है, हालांकि परिणाम नहीं क्या दूसरों के रूप में एक ही है, और शायद

$today = new DateTime(); 
$today->modify("+1 month"); 
echo $today->format("d.m.Y"); 

क्यों नहीं तो बस दुकान महीने और अलग से दिन और वेतन वृद्धि माह से पर: ओ पी की तलाश में है ई, और उसके बाद तारीख को मान्य करने के लिए PHP के checkdate फ़ंक्शन का उपयोग करें, जब तक कि तारीख मान्य न हो, दिन तक एक दिन घट जाए?

0

मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन एक अलग दृष्टिकोण देने के लिए सोचा।

date("m", strtotime($current."+1 month")); 

तब के दिन मिलता है: यह पता लगाने की (जो कुछ हद तक जटिल है) एक महीने के दिनों की कोशिश कर के

बजाय, एक चालू माह आसानी से उपयोग कर रहा है, जैसे अगले महीने पता कर सकते हैं वर्तमान माह date("d") का उपयोग कर, और उपरोक्त कोड से अगले महीने के साथ संगत।

3

इसे आजमाएं। reday फिर से भरने का दिन है (महीने का इंट-डे)। यदि आज से कम है, तो यह इस महीने के reday देगा लेकिन नहीं। इस महीने के दिनों में। यदि आज से अधिक अगले महीने की स्थिति में reday दें। मैं मासिक रीफिल बिंदु के "अगला रीफिल" की गणना के लिए इसका उपयोग करता हूं।वापसी dd/mm/yyyy

function nextrefill($reday) { 
    if (date("j") < $reday) { 
     $numd = date("t"); 
     if ($reday > $numd) { 
      return str_pad($numd, 2, "0", STR_PAD_LEFT).date("/m/Y"); 
     } else { 
      return str_pad($reday, 2, "0", STR_PAD_LEFT).date("/m/Y"); 
     } 
    } else { 
     $nextm = date('m', strtotime('first day of next month')); 
     $nextmy = date('Y', strtotime('first day of next month')); 
     $numd = cal_days_in_month(CAL_GREGORIAN, $nextm, $nextmy); 
     if ($reday > $numd) { 
      return str_pad($numd, 2, "0", STR_PAD_LEFT)."/".$nextm."/".$nextmy; 
     } else { 
      return str_pad($reday, 2, "0", STR_PAD_LEFT)."/".$nextm."/".$nextmy; 
     } 
    } 
} 
बात करने के लिए और अधिक प्रत्यक्ष (संपादित करें) के लिए

है

function nextmonthday($day) { 
     $next_month = date('m', strtotime('first day of next month')); 
     $year_of_next_month = date('Y', strtotime('first day of next month')); 
     $no_of_day_in_next_month = cal_days_in_month(CAL_GREGORIAN, $nextm, $nextmy); 
     if ($day > $no_of_day_in_next_month){ 
      return str_pad($no_of_day_in_next_month, 2, "0", STR_PAD_LEFT)."/".$next_month."/".$year_of_next_month; 
     } else { 
      return str_pad($day, 2, "0", STR_PAD_LEFT)."/".$next_month."/".$year_of_next_month; 
     } 
} 
+0

यकीन नहीं है कि मैं स्पष्टीकरण समझता हूं –

1

सरल

public function adicionarMesMantendoDia($date, $months, $format = "Y-m-d"){ 
     $date = \DateTime::createFromFormat($format, $date); 

     for($i=0;$i < $months; $i++){ 
      $date->modify('+ ' . date("t", $date->getTimestamp()) . ' day'); 
     } 
     return $date; 
} 
0

मैं भी यही समस्या थी, लेकिन वे के लिए पूरी तरह से काम नहीं कर सकता है जब मैं समाधान ऊपर की कोशिश की मैं, मैंने अपने अंत में कोशिश की और नए समाधान के साथ आया जो है:

$startDate = date("Y-m-d"); 
$month = date("m",strtotime($startDate)); 
$nextmonth = date("m",strtotime("$startDate +1 month")); 
if((($nextmonth-$month) > 1) || ($month == 12 && $nextmonth != 1)) 
{ 
    $nextDate = date('t.m.Y',strtotime("$startDate +1 week")); 
}else 
{ 
    $nextDate = date("Y-m-d",strtotime("$startDate +1 month")); 
} 
echo $nextSameDate = date("Y",$nextDate).'-'.date("m",$nextDate).'-'.date("d",$startDate); 
0

Datetime OOP शैली

<?php 
//Start Date -> 18-09-2015 
$expiry = new DateTime(); 
for($i=1;$i<5;$i++){ 
    $expiry->modify('+1 Month'); 
    echo $expiry->format('d-m-Y'); 
    echo '<br>'; 
} 
?> 

//18-10-2015 
//18-11-2015 
//18-12-2015 
//18-01-2016 
0

यह मैं क्या उपयोग

यह चालू माह तारीख

$month_timestamp = strtotime(date('Y-m', $create_timestamp)); 

वर्तमान दिन के एक टाइमस्टैम्प है

$current_day = date('d'); 

और यह "Ymd" प्रारूप में अगले महीने एक ही दिन है

$next_month_first = date('Y-m-' . $current_day, strtotime('next month', $month_timestamp)); 
0

के ऊपर गैर मौजूदा दिनों की देखभाल (30 फरवरी, या उदाहरण के लिए 31 अप्रैल) ले लिया कोई नहीं है, तो यहाँ है मेरी समारोह:

<?php 
function getSameDayNextMonth($time, $numberMonthsToAdd = 1) 
{ 
    list($year, $month, $day) = explode('-', date("Y-m-d", $time)); 

    // replace the day by one temporarily (just to make sure it exists for any month 
    $numberOfYearsToAdd = floor($numberMonthsToAdd/12); 
    $year += $numberOfYearsToAdd; 
    $month = ($month + $numberMonthsToAdd) % 12; 
    if (0 === $month) { 
     $month = 12; 
    } 
    $monthFormatted = sprintf('%02s', $month); 
    $nbDaysInThisMonth = date("t", strtotime("$year-$monthFormatted-01")); 

    if ((int)$day > $nbDaysInThisMonth) { 
     $day = $nbDaysInThisMonth; 
    } 
    $day = sprintf('%02s', $day); 
    return strtotime("$year-$monthFormatted-$day"); 
} 


$time = strtotime("2017-10-31"); 
for ($i = 0; $i <= 15; $i++) { 
    $_time = getSameDayNextMonth($time, $i); 
    echo date("Y-m-d", $_time) . '<br>'; 
} 

/** 
* 2017-10-31 
* 2017-11-30 
* 2017-12-31 
* 2017-01-31 
* 2017-02-28 
* 2017-03-31 
* 2017-04-30 
* 2017-05-31 
* 2017-06-30 
* 2017-07-31 
* 2017-08-31 
* 2017-09-30 
* 2018-10-31 
* 2018-11-30 
* 2018-12-31 
* 2018-01-31 
*/ 
संबंधित मुद्दे