增加date一个月

假设我有以下格式的date:2010-12-11(year-mon-day)

使用PHP,我希望将date递增一个月,如果需要,我希望年份自动递增(即从2012年12月到2013年1月递增)。

问候。

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

我需要一个类似的function,除了我需要一个月的周期(加上几个月,减去1天)之后,我search了一段时间后,我能够制作这个即插即用解决scheme。

 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格式selectdate

$ nMonths = 1; / /select你想要前进多less个月

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

使用DateTime::add

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

我使用克隆,因为添加修改原来的对象,这可能是不希望的。

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

这会返回一个可以和date函数一起使用的时间戳

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

这将弥补2月份和另外31天的月份。 你当然可以做更多的检查,以获得更准确的“下个月的这一天”的相对date格式 (这并不令人伤心,见下文),你也可以使用DateTime。

DateInterval('P1M')strtotime("+1 month")实际上是盲目地增加31天,而不pipe下个月的天数。

  • 2010-01-31 =>三月三号
  • 2012-01-31 => 3月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; //******************************************************************// 

请先把你的date格式设置为12-12-2012

使用此function后,它正常工作;

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

这里12-12-2012是你的date,+2个月是本月的增量;

您还增加了Year,Date

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

Ans是12-12-2013

谢谢贾森,你的post非常有帮助。 我重新格式化了它,并添加了更多的评论来帮助我理解这一切。 如果有人帮助,我已经发布在这里:

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

对于任何寻找任何date格式的答案的人。

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

只需更改date格式。

使用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