将日期增加一个月


103

假设我有一个以下格式的日期:2010-12-11(年一日)

使用PHP,我想将日期增加一个月,并且我希望年份可以在必要时自动增加(即,从2012年12月到2013年1月增加)。

问候。

Answers:


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
并非所有日期都有效。例如,2013-05-31将显示7月,而不是下个月的6月。
Patrick Desjardins

1
我正在2014年1月31日关注2014-03-03,原因是什么?
Manish Goyal'2

它不适用于以下字符串:“ 2014-06-19 15:00:19”
Meetai.com 2014年

1
有时确实会中断。@jason的答案在技术上更为正确,因为它可以解决leap年,月份长度等问题。应该将其标记为正确答案。
skift

4
此答案很危险,因为它在难以检测到的“每月的最后一天”场景中失败。
ckonig

43

除了每月周期(加上几个月,减去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

3
太好了,正是我所需要的。感谢您为我节省了很多时间!
Tum 2014年

没问题,很高兴您发现它有用
Jason

谢谢杰森,这非常有帮助。我将其重新格式化并添加了更多评论以帮助我理解所有内容。为了对所有人有帮助,我已将其张贴在下方(试图在此处添加,但时间过长)。
格雷格

1
它在1月30日和1月31日的值相同!
Satys

就像魅力一样,刚刚在2020年1月1日至12月31日进行了测试,谢谢!
Paul Nowak

34

使用DateTime::add

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

我使用克隆是因为add修改了原始对象,这可能是不希望的。


1
不起作用。.(新的DateTime(“ 2010-01-31”,新的DateTimeZone(“ UTC”)))-> add(新的DateInterval(“ P1M”))-> format('Ym-d')导致2010-03-03
Scholtz

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

这将返回一个可与date函数一起使用的时间戳


@Gelen:这行不通,给出错误的日期....请告诉我如何使用您的方法,这里$ time的值是多少?
sqlchild 2013年

这不起作用,给出错误的日期。...请告诉我如何使用您的方法,这里$ time的值是多少?
sqlchild

与接受的答案相同的问题。不适用于所有字符串。
Meetai.com 2014年

这对我有用(当然$time有一个初始值)。
tatskie

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

这将补偿2月和其他31天的月份。当然,您可以做更多的检查来获得“下个月的这一天” 相对日期格式的更准确信息(这很难过,请参阅下文),并且您也可以使用DateTime。

双方DateInterval('P1M')strtotime("+1 month")基本上是盲目地在下个月加入31天不管天数。

  • 2010-01-31 => 3月3日
  • 2012-01-31 => 3月2日(le年)

3
“不管下一个月的天数,盲加31天”,绝对正确!(+1)。
Jose Manuel AbarcaRodríguez17年


5

我用这种方式:

 $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
它为我工作,谢谢。但是,date('m',strtotime(“ + 1个月”,strtotime($ occDate)))和date('m',strtotime(“ + 1个月”,$ occDate))工作相同。

1
不,@ sah.cyBuzzSc有所不同。考虑示例:-$ occDate ='2014-12-28'; $ forOdNextMonth = date('m',strtotime(“ + 1 month”,$ occDate)); $ forOdNextMonth的值为02。–
vineet

感谢您的解释@chotesah。您的第二个例子很好。

3

请首先将日期格式设置为2012年12月12日

使用此功能后,它可以正常工作;

$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

感谢Jason,您的帖子非常有帮助。我重新格式化并添加了更多评论以帮助我理解所有内容。如果可以帮助任何人,我将其张贴在这里:

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

如果您想增加几天,也可以这样做

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

1

只需使用简单的方法更新答案即可找到几个月后的日期。作为标记的最佳答案并不能给出正确的解决方案。

<?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";

?>

仅此是+1个月日期的正确解决方案。
asad应用

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

用法示例:

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

0

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

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

只需更改日期格式。


-2

在输入框中放置一个日期,然后单击按钮在jQuery中获取日期

$(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
复制粘贴代码并不总是有帮助。您还应该解释一下代码。
mrkernelpanic

-2

所有提出的解决方案均无法正常工作。
strtotime()和DateTime :: addDateTime :: modify有时会给出无效的结果。
例如:
-31.08.2019 + 1个月为01.10.2019而不是30.09.2019-29.02.2020
+一年为01.03.2021而不是28.02.2021
(在PHP 5.5,PHP 7.3上测试)

以下是我基于Angelo提出的解决问题的想法的功能:

// $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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.