Ra&#250;l Ferr&#224;s - 1 year ago 88
PHP Question

# Adding days to a timestamp

Giving a starting date, I'm adding four times seven days to get 5 different dates separated exactly a week each one.

``````//\$date = '28-10-2010';
\$timestamp = mktime( 0, 0, 0, 10, 01, 2010 );
echo "Date=".date( 'd-m-Y', \$timestamp )."<br>";

\$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', \$timestamp )."<br>";

\$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', \$timestamp )."<br>";

\$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', \$timestamp )."<br>";

\$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', \$timestamp )."<br>";
``````

The code outputs this:

``````Date=01-10-2010 Friday
Date=08-10-2010 Friday
Date=15-10-2010 Friday
Date=22-10-2010 Friday
Date=29-10-2010 Friday
``````

Which as long as I know it's correct.
But, see what happens when going through the 2010-10-31 and 2010-11-01

\$timestamp = mktime( 0, 0, 0, 10, 28, 2010 );
[...]

Curiously it outputs this:

``````Date=28-10-2010 Thursday
Date=03-11-2010 Wednesday
Date=10-11-2010 Wednesday
Date=17-11-2010 Wednesday
Date=24-11-2010 Wednesday
``````

What's happening? Second date should be 04-11-2010!
Also, I saw that this "fail" happens every ten years!
Is this something related with the daylight savings time? If so, how do I solve it?
Is there anything that i am overlooking?

Edit: Ok, I outputed the time, just to see what happens and this is what I got now:

``````Date=28-10-2010 Thursday :: 00:00:00
Date=03-11-2010 Wednesday :: 23:00:00
Date=10-11-2010 Wednesday :: 23:00:00
Date=17-11-2010 Wednesday :: 23:00:00
Date=24-11-2010 Wednesday :: 23:00:00
``````

Seems something related with the time, something happens at 2010-11-31...

Never use math like 60*60*24*7 to add/subtract days (because of daylight time saving), use `strtotime` or `mktime` instead:

``````\$timestamp = strtotime('+7 days', \$timestamp);

// Or something like this (it's OK to have day parameter <= 0 or > 31)
\$timestamp = mktime(0, 0, 0, \$month, \$day + 7, \$year);
``````

Your example will be more obvious if you'll output time as well:

``````\$timestamp = mktime(0, 0, 0, 10, 28, 2010);
echo date('Y-m-d H:i:s', \$timestamp) . "\n";

\$timestamp += 60*60*24*7;
echo date('Y-m-d H:i:s', \$timestamp) . "\n";
``````

Output:

``````2010-10-28 00:00:00
2010-11-03 23:00:00
``````

Here you have `2010-11-03 23:00:00` instead of `2010-11-04 00:00:00` because one of the days (31 Oct) is 25 hours long instead of 24.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download