add one year to datetime with php

Current (2017) Practice is to use DateTime

This question is top on a google search for "php datetime add one year", but severely outdated. While most of the previous answers will work fine for most cases, the established standard is to use DateTime objects for this instead, primarily due strtotime requiring careful manipulation of timezones and DST.

TL;DR

  1. Convert to DateTime: $date = new DateTime('2011-03-07 00:33:45', [user TZ]);
  2. Use DateTime::modify: $date->modify('+1 year');
  3. Format to needs.
    • Change the timezone with DateTime::setTimezone from the list of supported timezones: $date->setTimezone(new DateTimeZone('Pacific/Chatham'));
    • Convert to string with DateTime::format: echo $date->format('Y-m-d H:i:s');

Following this pattern for manipulating dates and times will handle the worst oddities of timezone/DST/leap-time for you.

Just remember two final notes:

  • Life is easier with your system timezone set at UTC.
  • NEVER modify the system timezone outside of configuration files.
    • I've seen too much code that relies on date_default_timezone_set. If you're doing this, stop. Save the timezone in a variable, and pass it around your application instead, please.

More Reading

How to calculate the difference between two dates using PHP?

Convert date format yyyy-mm-dd => dd-mm-yyyy

PHP - strtotime, specify timezone


strtotime() is the function you're looking for:

$data['user']['seal_data'] = date('Y-m-d H:i:s', strtotime('+1 year', strtotime($data['user']['time'])));

I think you could use strtotime() to do this pretty easily. Something like:

$newdata = date('c', strtotime($data['user']['time'] . ' +1 year'));

Though the 'c' format string isn't the same as your input format. You could consult date()'s docs for how to construct the correct one.

'Y-m-d H:i:s' — as Tim Cooper suggests — looks correct.


First, you have to convert the MySQL datetime to something that PHP can understand. There are two ways of doing this...

  1. Use UNIX_TIMESTAMP() in your query to tell MySQL to return a UNIX timestamp of the datetime column.

    SELECT whatever, UNIX_TIMESTAMP(myTime) AS 'myUnixTime' FROM myTable;
    
  2. Use DateTime::createFromFormat to convert your string time to something PHP can understand.

    $date = DateTime::createFromFormat('Y-m-d H:i:s', $data['user']['time']);
    

Once that is done, you can work with the time... Depending on the method you used above, you can use one of the following.

  1. If you have a unix timestamp, you can use the following to add a year:

    $inAYear = strtotime('+1 year', $data['user']['unixTime']);
    
  2. If you have a DateTime object, you can use the following:

    $inAYear = $date->add(new DateInterval('P1Y'));
    

Now, to display your date in a format that is respectable, you must tell PHP to return a string in the proper format.

  1. If you have a unix timestamp, you can use the following:

    $strTime = date('Y-m-d H:i:s', $inAYear);
    
  2. If you have a DateTime object, you can use the following:

    $strTime = $inAYear->format('Y-m-d H:i:s');
    

Alternatively, if you don't want to deal with all of that, you can simply add one year when you query.

SELECT whatever, DATE_ADD(myTime, INTERVAL 1 YEAR) AS 'inAYear' FROM myTable;

Tags:

Php