tarihi bir ay artır


103

Diyelim ki şu formatta bir tarihim var: 2010-12-11 (yıl-pazartesi)

PHP ile tarihi bir ay artırmak istiyorum ve gerekirse yılın otomatik olarak artırılmasını istiyorum (yani Aralık 2012'den Ocak 2013'e kadar).

Saygılarımızla.

Yanıtlar:


167
$time = strtotime("2010.12.11");
$final = date("Y-m-d", strtotime("+1 month", $time));

// Finally you will have the date you're looking for.

31
Tüm tarihlerle çalışmıyor. Örneğin, 2013-05-31, sonraki ay olan Haziran yerine Temmuz'u gösterecektir.
Patrick Desjardins

1
2014-01-31 nedeniyle 2014-03-03'ü takip ediyorum?
Manish Goyal

Şu dizeyle çalışmadı: "2014-06-19 15:00:19"
Meetai.com

1
Bu bazen bozulur. @Jason'un cevabı teknik olarak daha doğrudur çünkü artık yıllar, ay uzunlukları vb. Gibi şeyleri hesaba katar. Bu, doğru cevap olarak işaretlenmelidir.
Skift

4
bu cevap tehlikelidir çünkü tespit edilmesi zor olan "ayın son günü" senaryolarında başarısız olur.
ckonig

43

Aylık bir döngü (artı aylar, eksi 1 gün) dışında benzer işlevlere ihtiyacım vardı. Bir süre SO'da arama yaptıktan sonra, şu tak-çalıştır çözümünü oluşturabildim:

function add_months($months, DateTime $dateObject) 
    {
        $next = new DateTime($dateObject->format('Y-m-d'));
        $next->modify('last day of +'.$months.' month');

        if($dateObject->format('d') > $next->format('d')) {
            return $dateObject->diff($next);
        } else {
            return new DateInterval('P'.$months.'M');
        }
    }

function endCycle($d1, $months)
    {
        $date = new DateTime($d1);

        // call second function to add the months
        $newDate = $date->add(add_months($months, $date));

        // goes back 1 day from date, remove if you want same day of month
        $newDate->sub(new DateInterval('P1D')); 

        //formats final date to Y-m-d form
        $dateReturned = $newDate->format('Y-m-d'); 

        return $dateReturned;
    }

Misal:

$startDate = '2014-06-03'; // select date in Y-m-d format
$nMonths = 1; // choose how many months you want to move ahead
$final = endCycle($startDate, $nMonths); // output: 2014-07-02

3
Mükemmel, tam da ihtiyacım olan şey. Bana çok zaman ayırdığınız için teşekkürler!
Tum

Sorun değil, yararlı bulduğunuza sevindim
Jason

Teşekkürler Jason, bu çok yardımcı oldu. Yeniden biçimlendirdim ve hepsini anlamama yardımcı olmak için daha fazla yorum ekledim. Herhangi birine yardımcı olması durumunda, onu daha da aşağıya gönderdim (buraya eklemeye çalıştım ama çok uzundu).
Greg

1
30 Ocak ve 31 Ocak için aynı değeri veriyor!
Satys

Bir cazibe gibi çalışıyor, az önce 1 Ocak - 31 Aralık 2020 için test ettik, teşekkürler!
Paul Nowak

34

Kullanın DateTime::add.

$start = new DateTime("2010-12-11", new DateTimeZone("UTC"));
$month_later = clone $start;
$month_later->add(new DateInterval("P1M"));

Klon kullandım çünkü add orijinal nesneyi değiştiriyor, ki bu istenmeyebilir.


2
çalışmıyor .. (yeni DateTime ("2010-01-31", yeni DateTimeZone ("UTC"))) -> ekle (yeni DateInterval ("P1M")) -> format ('Ym-g') ile sonuçlanır 2010-03-03
Scholtz

13
strtotime( "+1 month", strtotime( $time ) );

bu, tarih işleviyle kullanılabilecek bir zaman damgası döndürür


@Gelen: Bu işe yaramıyor, yanlış tarih veriyor .... Lütfen yönteminizi nasıl kullanacağınızı söyleyin, burada $ time'ın değeri nedir?
sqlchild

bu işe yaramıyor, yanlış tarih veriyor .... lütfen yönteminizi nasıl kullanacağınızı söyleyin, burada $ time'ın değeri nedir?
sqlchild

Kabul edilen cevapla aynı sorun. Tüm dizelerde çalışmıyor.
Meetai.com

bu benim için çalışıyor (elbette $timebir başlangıç ​​değeri var).
tatskie

6
(date('d') > 28) ? date("mdY", strtotime("last day of next month")) : date("mdY", strtotime("+1 month"));

Bu, Şubat ayı ve diğer 31 günlük ayları telafi edecek. Elbette, 'önümüzdeki ayın bu günü' göreli tarih biçimlerini daha kesin hale getirmek için çok daha fazla kontrol yapabilirsiniz (bu ne yazık ki işe yaramaz, aşağıya bakın) ve aynı zamanda DateTime'ı da kullanabilirsiniz.

Hem DateInterval('P1M')ve strtotime("+1 month")esasen gözü kapalı takip eden ay içinde bakılmaksızın gün sayısı 31 gün ekliyoruz.

  • 2010-01-31 => 3 Mart
  • 2012-01-31 => 2 Mart (artık yıl)

3
"Bir sonraki ayın sayısından bağımsız olarak körü körüne 31 gün eklemek", kesinlikle doğru! (+1).
Jose Manuel Abarca Rodríguez

6

Bunun gibi kullanabilirsiniz DateTime::modify:

$date = new DateTime('2010-12-11');
$date->modify('+1 month');

Belgelere bakın:

http://php.net/manual/fr/datetime.modify.php

http://php.net/manual/fr/class.datetime.php


1
bu 31 Mayıs'tan 1 Temmuz'a atlıyor, bu yanlış
ckonig

Evet gerçekten ... Bu sorunu çözmek için gönderimi düzenleyeceğim
HRoux 01

Hala bozuk:php > var_dump((new DateTime('2010-05-31'))->modify('+1 month')); object(DateTime)#2 (3) { ["date"]=> string(26) "2010-07-01 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" }
Chris Stryczynski

5

Bu şekilde kullanıyorum: -

 $occDate='2014-01-28';
 $forOdNextMonth= date('m', strtotime("+1 month", strtotime($occDate)));
//Output:- $forOdNextMonth=02


/*****************more example****************/
$occDate='2014-12-28';

$forOdNextMonth= date('m', strtotime("+1 month", strtotime($occDate)));
//Output:- $forOdNextMonth=01

//***********************wrong way**********************************//
$forOdNextMonth= date('m', strtotime("+1 month", $occDate));
  //Output:- $forOdNextMonth=02; //instead of $forOdNextMonth=01;
//******************************************************************//

1
benim için çalışıyor teşekkürler. Ancak tarih ('m', strtotime ("+ 1 month", strtotime ($ occDate))) ve tarih ('m', strtotime ("+ 1 month", $ occDate)) aynı şekilde çalışır.

1
Hayır, ikisi de fark @ sah.cyBuzzSc. Örneği düşünün: - $ occDate = '2014-12-28'; $ forOdNextMonth = tarih ('m', strtotime ("+ 1 ay", $ occDate)); $ ForOdNextMonth değeri 02'dir.
vineet

@chotesah'ı açıkladığın için teşekkürler. İkinci örneğiniz oldukça iyi.

4

Lütfen önce tarih formatınızı 12-12-2012 gibi ayarlayın

Bu işlevi kullandıktan sonra düzgün çalışır;

$date =  date('d-m-Y',strtotime("12-12-2012 +2 Months");

Burada 12-12-2012 tarihiniz ve +2 Ay, ayın artışıdır;

Ayrıca Year, Date değerini artırırsınız

strtotime("12-12-2012 +1 Year");

Ans 12-12-2013


1

Teşekkürler Jason, gönderiniz çok yardımcı oldu. Yeniden biçimlendirdim ve hepsini anlamama yardımcı olmak için daha fazla yorum ekledim. Herhangi birine yardımcı olması durumunda, buraya gönderdim:

function cycle_end_date($cycle_start_date, $months) {
    $cycle_start_date_object = new DateTime($cycle_start_date);

    //Find the date interval that we will need to add to the start date
    $date_interval = find_date_interval($months, $cycle_start_date_object);

    //Add this date interval to the current date (the DateTime class handles remaining complexity like year-ends)
    $cycle_end_date_object = $cycle_start_date_object->add($date_interval);

    //Subtract (sub) 1 day from date
    $cycle_end_date_object->sub(new DateInterval('P1D')); 

    //Format final date to Y-m-d
    $cycle_end_date = $cycle_end_date_object->format('Y-m-d'); 

    return $cycle_end_date;
}

//Find the date interval we need to add to start date to get end date
function find_date_interval($n_months, DateTime $cycle_start_date_object) {
    //Create new datetime object identical to inputted one
    $date_of_last_day_next_month = new DateTime($cycle_start_date_object->format('Y-m-d'));

    //And modify it so it is the date of the last day of the next month
    $date_of_last_day_next_month->modify('last day of +'.$n_months.' month');

    //If the day of inputted date (e.g. 31) is greater than last day of next month (e.g. 28)
    if($cycle_start_date_object->format('d') > $date_of_last_day_next_month->format('d')) {
        //Return a DateInterval object equal to the number of days difference
        return $cycle_start_date_object->diff($date_of_last_day_next_month);
    //Otherwise the date is easy and we can just add a month to it
    } else {
        //Return a DateInterval object equal to a period (P) of 1 month (M)
        return new DateInterval('P'.$n_months.'M');
    }
}

$cycle_start_date = '2014-01-31'; // select date in Y-m-d format
$n_months = 1; // choose how many months you want to move ahead
$cycle_end_date = cycle_end_date($cycle_start_date, $n_months); // output: 2014-07-02

1
$date = strtotime("2017-12-11");
$newDate = date("Y-m-d", strtotime("+1 month", $date));

Günlerce artırmak istiyorsanız, bunu da yapabilirsiniz.

$date = strtotime("2017-12-11");
$newDate = date("Y-m-d", strtotime("+5 day", $date));

1

Ay sayısından sonra tarihi bulmak için cevabı basit bir yöntemle günceller. İşaretlenen en iyi cevap doğru çözümü vermez.

<?php

    $date = date('2020-05-31');
    $current = date("m",strtotime($date));
    $next = date("m",strtotime($date."+1 month"));
    if($current==$next-1){
        $needed = date('Y-m-d',strtotime($date." +1 month"));
    }else{
        $needed = date('Y-m-d', strtotime("last day of next month",strtotime($date)));
    }
    echo "Date after 1 month from 2020-05-31 would be : $needed";

?>

Yalnızca Bu, +1 aylık tarih için doğru çözümdür.
asad uygulaması

0
function dayOfWeek($date){
    return DateTime::createFromFormat('Y-m-d', $date)->format('N');
}

Kullanım örnekleri:

echo dayOfWeek(2016-12-22);
// "4"
echo dayOfWeek(date('Y-m-d'));
// "4"

0

Herhangi bir tarih formatına cevap arayan herkes için.

echo date_create_from_format('d/m/Y', '15/04/2017')->add(new DateInterval('P1M'))->format('d/m/Y');

Sadece tarih formatını değiştirin.


-2

giriş kutusuna bir tarih girin ve ardından jQuery'deki tarihten itibaren tarihi al düğmesine tıklayın

$(document).ready( function() {
    $("button").click(function(){   
    var day = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
    var a = new Date();
    $(".result").text(day[a.getDay()]);

    });  
             });

-2
 <?php
              $selectdata ="select fromd,tod  from register where username='$username'";
            $q=mysqli_query($conm,$selectdata);
            $row=mysqli_fetch_array($q);

            $startdate=$row['fromd']; 
            $stdate=date('Y', strtotime($startdate));  

            $endate=$row['tod']; 
            $enddate=date('Y', strtotime($endate));  

            $years = range ($stdate,$enddate);
            echo '<select name="years" class="form-control">';
            echo '<option>SELECT</option>';
            foreach($years as $year)
              {   echo '<option value="'.$year.'"> '.$year.' </option>';  }
                echo '</select>'; ?>

2
Kodu yapıştırmak her zaman yardımcı olmuyor. Ayrıca kodu biraz açıklamalısınız.
mrkernelpanic

-2

Sunulan tüm çözümler düzgün çalışmıyor.
strtotime () ve DateTime :: add veya DateTime :: modify bazen geçersiz sonuçlar verir.
Örnekler:
- 31.08.2019 + 1 ay, 30.09.2019 yerine 01.10.2019 değerini verir
- 29.02.2020 + 1 yıl, 28.02.2021 yerine 01.03.2021 değerini verir
(PHP 5.5, PHP 7.3 üzerinde test edilmiştir)

Aşağıda, Angelo tarafından yayınlanan ve sorunu çözen fikre dayanan işlevim var:

// $time - unix time or date in any format accepted by strtotime() e.g. 2020-02-29  
// $days, $months, $years - values to add
// returns new date in format 2021-02-28
function addTime($time, $days, $months, $years)
{
    // Convert unix time to date format
    if (is_numeric($time))
    $time = date('Y-m-d', $time);

    try
    {
        $date_time = new DateTime($time);
    }
    catch (Exception $e)
    {
        echo $e->getMessage();
        exit;
    }

    if ($days)
    $date_time->add(new DateInterval('P'.$days.'D'));

    // Preserve day number
    if ($months or $years)
    $old_day = $date_time->format('d');

    if ($months)
    $date_time->add(new DateInterval('P'.$months.'M'));

    if ($years)
    $date_time->add(new DateInterval('P'.$years.'Y'));

    // Patch for adding months or years    
    if ($months or $years)
    {
        $new_day = $date_time->format("d");

        // The day is changed - set the last day of the previous month
        if ($old_day != $new_day)
        $date_time->sub(new DateInterval('P'.$new_day.'D'));
    }
    // You can chage returned format here
    return $date_time->format('Y-m-d');
}

Kullanım örnekleri:

echo addTime('2020-02-29', 0, 0, 1); // add 1 year (result: 2021-02-28)
echo addTime('2019-08-31', 0, 1, 0); // add 1 month (result: 2019-09-30)
echo addTime('2019-03-15', 12, 2, 1); // add 12 days, 2 months, 1 year (result: 2019-09-30)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.