дата увеличения на один месяц - PullRequest
92 голосов
/ 20 мая 2010

Допустим, у меня есть дата в следующем формате: 2010-12-11 (год-понедельник)

В PHP я хочу увеличить дату на один месяц, и я хочу, чтобы год был автоматически увеличен, если это необходимо (т.е. с декабря 2012 года по январь 2013 года).

Привет.

Ответы [ 15 ]

142 голосов
/ 20 мая 2010
$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 голосов
/ 03 июня 2014

Мне нужна была аналогичная функциональность, за исключением месячного цикла (плюс месяцы, минус 1 день). После поиска С.О. Некоторое время мне удавалось создать это решение типа «подключи и работай»:

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

Пример:

$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
28 голосов
/ 20 мая 2010

Использование DateTime::add.

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

Я использовал клон , поскольку add изменяет исходный объект, что может быть нежелательным.

13 голосов
/ 20 мая 2010
strtotime( "+1 month", strtotime( $time ) );

возвращает метку времени, которую можно использовать с функцией даты

5 голосов
/ 19 января 2015

Я использую этот способ: -

 $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;
//******************************************************************//
5 голосов
/ 11 ноября 2014
(date('d') > 28) ? date("mdY", strtotime("last day of next month")) : date("mdY", strtotime("+1 month"));

Это компенсирует февраль и остальные 31 дневные месяцы. Конечно, вы могли бы сделать гораздо больше проверок, чтобы получить более точные значения для «этот день в следующем месяце» форматы относительной даты (что не работает, к сожалению, см. Ниже), и вы также можете использовать DateTime.

И DateInterval('P1M'), и strtotime("+1 month"), по сути, слепо прибавляют 31 день независимо от количества дней в следующем месяце.

  • 2010-01-31 => 3 марта
  • 2012-01-31 => 2 марта (високосный год)
4 голосов
/ 01 ноября 2017

Вы можете использовать DateTime::modify так:

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

См. Документацию:

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

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

3 голосов
/ 15 ноября 2016

Пожалуйста, сначала установите формат даты как 12-12-2012

После использования этой функции она работает правильно;

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

Здесь 12-12-2012 - ваша дата, а +2 месяца - приращение месяца;

Вы также увеличиваете год, дату

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

Ответ 12-12-2013

1 голос
/ 06 мая 2017
$date = strtotime("2017-12-11");
$newDate = date("Y-m-d", strtotime("+1 month", $date));

Если вы хотите увеличить по дням, вы также можете сделать это

$date = strtotime("2017-12-11");
$newDate = date("Y-m-d", strtotime("+5 day", $date));
0 голосов
/ 27 мая 2019

Все представленные решения не работают должным образом.
strtotime () и DateTime :: add или DateTime :: modify дают иногда неверные результаты.
Примеры:
- 31.08.2019 + 1 месяц дает 01.10.2019 вместо 30.09.2019
- 29.02.2020 + 1 год дает 01.03.2021 вместо 28.02.2021
(проверено на PHP 5.5, PHP 7.3)

Ниже приведена моя функция, основанная на идее , опубликованной Анджело , которая решает проблему:

// $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');
}

Примеры использования:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...