приращение на один месяц

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

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

С уважением.

$time = strtotime("2010.12.11"); $final = date("Ymd", strtotime("+1 month", $time)); // Finally you will have the date you're looking for. 

Мне нужна была аналогичная функциональность, за исключением того, что мне нужен месячный цикл (плюс месяцы, минус 1 день), после того, как я долго искал SO, я смог обработать это решение plug-n-play.

 function add_months($months, DateTime $dateObject) { $next = new DateTime($dateObject->format('Ym-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 Ymd form $dateReturned = $newDate->format('Ym-d'); return $dateReturned; } 

пример:

$ startDate = '2014-06-03'; // выберите дату в формате Ymd

$ nMonths = 1; // выберите, сколько месяцев вы хотите продвинуться вперед

$ final = endCycle ($ startDate, $ nMonths) // output: 2014-07-02

Используйте DateTime::add .

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

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

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

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

 (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 марта (високосный год)

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

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

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

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

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

Здесь 12-12-2012 – ваша дата и +2 месяца – это прирост месяца;

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

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

Ans – 12-12-2013

Спасибо Джейсон, ваш пост был очень полезен. Я переформатировал его и добавил больше комментариев, чтобы помочь мне понять все это. В случае, если кто-то помог, я разместил его здесь:

 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 Ymd $cycle_end_date = $cycle_end_date_object->format('Ym-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('Ym-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 (eg 31) is greater than last day of next month (eg 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 Ymd 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 
 function dayOfWeek($date){ return DateTime::createFromFormat('Ym-d', $date)->format('N'); } 

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

 echo dayOfWeek(2016-12-22); // "4" echo dayOfWeek(date('Ym-d')); // "4" 
 $date = strtotime("2017-12-11"); $newDate = date("Ymd", strtotime("+1 month", $date)); 

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

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

Для тех, кто ищет ответ на любой формат даты.

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

Просто измените формат даты.

Использовать DateTime :: изменить следующим образом:

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

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

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

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