PHP Sonraki ay, aynı gün

10 Cevap php

Ben son kez (ve acil) her ayın aynı günü planlanan gereken bir "olay" requeriment var.

Eğer (bir sonraki olanları aya bağlı olarak 30 veya 28 olabilir Sorun 31 üzerinde bir başlangıç ​​tarihi ile gelir Haz, vb 1 Temmuz ve 1 sonraki olayları almalısınız Mayıs 1st başlangıç ​​tarihini ayarlayın söylemek )

Ayın kendisi ve yıl bağlı olarak farklı gün sayısı (28,30,31) ile ay olduğunu düşünüyor ... ne olur kurulum bu ba kolay bir yolu?

Aşağıdaki (ve kusurlu) nextmonth fonksiyonunu düşünün:

$events = array()

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

Eklemek için düzenlenebilir: Benim için sorun basitçe enought, herhangi bir ayın gün sayısının ne olduğunu çözmek ve böylece bir sonraki gelen tarihi almak için, bir ..

10 Cevap

Update:

Bu size verilen aydaki gün sayısını verecektir:

echo date('t', $timestamp);

Bkz: date()

Old answer:

Ben sizin düşündüğünüzü algoritması hakkında emin değilim ama bu size yardımcı olacağına inanıyoruz:

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

mktime(0,0,0,date("m")+$X,date('d'),date("Y"));: Bu $ X ay öncesinde boyunca uygun zaman damgası dönecektir

I recommend reading the following comment on php.net. strtotime() (php.net)

Edit: Bir sonraki cevabı orada gösterilen içeriğini deşifre etmek mümkün olmayanlar için yayınlanan link "özeti" verir.

Bu deneyin. (- Ayın günü int) reday dolum günüdür. Bugün daha az ise, o reday Bu ayın ama fazla değil verecektir. Bu ay gün. Bugün daha fazla reday önümüzdeki ay aynı durumun verirseniz. Ben hesapla aylık dolum noktası "Sonraki doldurma" Bu kullanabilirsiniz. dönüş 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;
        }
    }
}

daha doğrudan işaret etmek için (Düzenle)

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

Bir şaka olarak çalıştı, ve aslında çalışır

strtotime('last day next month')

Yani:

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

Bu gün gelecek ay yoksa dışında bu gün, gelecek ay: ay şimdiye boyutu değişmiştir olduğundan, önümüzdeki ay ayarlamak için en iyi yol gibi bir şey olmaz.

Örnek:

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

ya da sadece, strtotime("+1 month")

Nasıl bu işlevi hakkında:

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

comments olarak strtotime giriş altında php.net manuel sitede başka bir çözüm yoktur.

Kimse bu alternatif söz, sonuç diğerleri gibi aynı olsa da, muhtemelen OP arıyor değil ne:

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

Neden sonra sonra sadece mağaza ay ve gün ayrı ayrı ve artım ay tek, ve tarih geçerlidir kadar tek gün azalmaktadır, tarihini doğrulamak için PHP'nin checkdate fonksiyonunu kullanmak değil mi?

Ben bu eski bir yazı olduğunu biliyorum ama farklı bir yaklaşım vermek düşündüm.

Peki yerine (biraz karmaşık) bir ay içinde günlerini anlamaya çalışırken, bir örneğin, kolayca geçerli ayı kullanarak gelecek ay öğrenebilirsiniz:

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

Sonra bulunduğumuz ayın günü yukarıdaki koddan sonraki ay ile date("d"), ve concat kullanarak alabilirsiniz.

Basit

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