user796443
user796443

Reputation:

PHP add 1 month to date

I've a function that returns url of 1 month before.

I'd like to display current selected month, but I cannot use simple current month, cause when user clicks link to 1 month back selected month will change and will not be current.

So, function returns August 2012

How do I make little php script that adds 1 month to that?

so far I've:

<?php echo strip_tags(tribe_get_previous_month_text()); ?>

Upvotes: 6

Views: 35458

Answers (7)

Michael Cavallin
Michael Cavallin

Reputation: 21

Since we know that strtotime(+1 month) always adds 30 days it can be some troubles with dates ending with the day 31, 30 or 29 AND if you still want to stay within the last day of the next month.

So I wrote this over complicated script to solve that issue as well as adapting so that you can increase all type of formats like years, months, days, hours, minutes and seconds.


function seetime($datetime, $p = '+', $i, $m = 'M', $f = 'Y-m-d H:i:s')
{
    
    /* 
    $datetime needs to be in format of YYYY-MM-DD HH:II:SS but hours, minutes and seconds are not required
    $p can only be "+" to increse or "-" to decrese
    $i is the amount you want to change
    $m is the type you want to change
    
    Allowed types:
    Y = Year
    M = Months
    D = Days
    W = Weeks
    H = Hours
    I = Minutes
    S = Seconds
    
    $f is the datetime format you want the result to be returned in
    
    */
    $validator_y = substr($datetime,0,4);
    $validator_m = substr($datetime,5,2);
    $validator_d = substr($datetime,8,2);
    
    if(checkdate($validator_m, $validator_d, $validator_y))
    {
        $datetime = date('Y-m-d H:i:s', strtotime($datetime));
        #$p = either "+" to add or "-" to subtract
        if($p == '+' || $p == '-')
        {
            if(is_int($i))
            {
                if($m == 'Y')
                {
                    $year = date('Y', strtotime($datetime));
                    $rest = date('m-d H:i:s', strtotime($datetime));
                    
                    if($p == '+')
                    {
                        $ret = $year + $i;
                    }
                    else
                    {
                        $ret = $year - $i;
                    }
                    
                    $str = $ret.'-'.$rest;
                    
                    return(date($f, strtotime($str)));
                }
                elseif($m == 'M')
                {
                    $year = date('Y', strtotime($datetime));
                    $month = date('n', strtotime($datetime));
                    $rest = date('d H:i:s', strtotime($datetime));
                    $his = date('H:i:s', strtotime($datetime));
                    if($p == '+')
                    {
                        $ret = $month + $i;
                        $ret = sprintf("%02d",$ret);
                        
                    }
                    else
                    {
                        $ret = $month - $i;
                        $ret = sprintf("%02d",$ret);
                        
                    }
                    
                    
                    if($ret < 1)
                    {
                        $ret = $ret - $ret - $ret;
                        $years_back = floor(($ret + 12) / 12);
                        $monts_back = $ret % 12;
                        $year = $year - $years_back;
                        $month = 12 - $monts_back;
                        $month = sprintf("%02d",$month);
                        $new_date = $year.'-'.$month.'-'.$rest;
                        $ym = $year.'-'.$month;
                        
                        $validator_y = substr($new_date,0,4);
                        $validator_m = substr($new_date,5,2);
                        $validator_d = substr($new_date,8,2);
                        if(checkdate($validator_m, $validator_d, $validator_y))
                        {
                            return (date($f, strtotime($new_date)));
                        }
                        else
                        {
                            $days = date('t',strtotime($ym));
                            $new_date = $ym.'-'.$days.' '.$his;
                            return (date($f, strtotime($new_date)));
                        }
                    }
                    if($ret > 12)
                    {
                        
                        $years_forw = floor($ret / 12);
                        $monts_forw = $ret % 12;
                        $year = $year + $years_forw;
                        $month = sprintf("%02d",$monts_forw);
                        $new_date = $year.'-'.$month.'-'.$rest;
                        $ym = $year.'-'.$month;
                        
                        $validator_y = substr($new_date,0,4);
                        $validator_m = substr($new_date,5,2);
                        $validator_d = substr($new_date,8,2);
                        if(checkdate($validator_m, $validator_d, $validator_y))
                        {
                            return (date($f, strtotime($new_date)));
                        }
                        else
                        {
                            $days = date('t',strtotime($ym));
                            $new_date = $ym.'-'.$days.' '.$his;
                            return (date($f, strtotime($new_date)));
                        }
                    }
                    else
                    {
                        $ym = $year.'-'.$month;
                        $new_date = $year.'-'.$ret.'-'.$rest;
                        
                        $validator_y = substr($new_date,0,4);
                        $validator_m = substr($new_date,5,2);
                        $validator_d = substr($new_date,8,2);
                        if(checkdate($validator_m, $validator_d, $validator_y))
                        {
                            return (date($f, strtotime($new_date)));
                        }
                        else
                        {
                            $ym = $validator_y . '-'.$validator_m;
                            $days = date('t',strtotime($ym));
                            $new_date = $ym.'-'.$days.' '.$his;
                            return (date($f, strtotime($new_date)));
                        }
                        
                    }
                }
                elseif($m == 'D')
                {
                    return (date($f, strtotime($datetime.' '.$p.$i.' days')));
                }
                elseif($m == 'W')
                {
                    return (date($f, strtotime($datetime.' '.$p.$i.' weeks')));
                }
                elseif($m == 'H')
                {
                    return (date($f, strtotime($datetime.' '.$p.$i.' hours')));
                }
                elseif($m == 'I')
                {
                    
                    return (date($f, strtotime($datetime.' '.$p.$i.' minutes')));
                }
                elseif($m == 'S')
                {
                    return (date($f, strtotime($datetime.' '.$p.$i.' seconds')));
                }
                else
                {
                    return 'Fourth parameter can only be any of following: Valid Time Parameters Are: Y M D Q H I S';
                }
            }
            else
            {
                return 'Third parameter can only be a number (whole number)';
            }           
        }
        else
        {
            return 'Second parameter can only be + to add or - to subtract';
        }
    }
    else    
    {
        return 'Date is not a valid date';
    }   
    
}

Upvotes: -1

Kamlesh
Kamlesh

Reputation: 6135

Date difference

$date1 = '2017-01-20';
$date2 = '2019-01-20';

$ts1 = strtotime($date1);
$ts2 = strtotime($date2);

$year1 = date('Y', $ts1);
$year2 = date('Y', $ts2);

$month1 = date('m', $ts1);
$month2 = date('m', $ts2);

echo $joining_months = (($year2 - $year1) * 12) + ($month2 - $month1);

Upvotes: 0

vlad awtsu
vlad awtsu

Reputation: 195

Hi In Addition to their answer. I think if you just want to get the next month based on the current date here's my solution.

$today = date("Y-m-01");

$sNextMonth = (int)date("m",strtotime($today." +1 months") );

Notice That i constantly define the day to 01 so that we're safe on getting the next month. if that is date("Y-m-d"); and the current day is 31 it will fail.

Hope this helps.

Upvotes: 2

oliver
oliver

Reputation: 2833

You can simple use the strtotime function on whatever input you have to arrive at April 2012 then apply the date and strtotime with an increment period of '+1 month'.

$x = strtotime($t);
$n = date("M Y",strtotime("+1 month",$x));
echo $n; 

Here are the relevant sections from the PHP Handbook:

http://www.php.net/manual/en/function.date.php

https://secure.php.net/manual/en/function.strtotime.php

This solution solves the additional issue of incrementing any amount of time to a time value.

Upvotes: 2

Nolly Parpan
Nolly Parpan

Reputation: 71

there are 3 options/answers

     $givendate is the given date (ex. 2016-01-20)

option 1:
        $date1 = date('Y-m-d', strtotime($givendate. ' + 1 month'));

option 2:
        $date2 = date('Y-m-d', strtotime($givendate. ' + 30 days'));

option 3:
        $number = cal_days_in_month(CAL_GREGORIAN, date('m', strtotime($givendate)), date('Y', strtotime($givendate)));
        $date3 = date('Y-m-d', strtotime($date2. ' + '.$number.' days'));

Upvotes: 7

Marc B
Marc B

Reputation: 360672

simple method:

$next_month = strtotime('august 2012 next month');

better method:

$d = new Date('August 2012');
$next_month = $d->add(new DateInterval('P1M'));

relevant docs: strtotime date dateinterval

Upvotes: 10

Bgi
Bgi

Reputation: 2494

You can with the DateTime class and the DateTime::add() method:

Documentation

Upvotes: 2

Related Questions