Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding days to a timestamp

Tags:

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...

like image 247
Pherrymason Avatar asked Aug 03 '10 14:08

Pherrymason


People also ask

How do you add 2 hours to a timestamp?

To add 2 hours in the current time, we will use the DATE_ADD() function. mysql> select DATE_ADD(now(),interval 2 hour);

What are the correct ways to add one day to a date in Snowflake?

SELECT DATE_TRUNC('month', current_date()); Get the last day of the current month as a DATE value using the DATEADD and DATE_TRUNC functions: SELECT DATEADD('day',-1, DATE_TRUNC('month', DATEADD(day,31,DATE_TRUNC('month',current_date()) ) ) );


2 Answers

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.

like image 83
Alexander Konstantinov Avatar answered Oct 18 '22 12:10

Alexander Konstantinov


In case someone needs this, just like me referencing the site: Today, current time, Y-m-d H:i:s, plus +7 Days. OR you could add +3 Months, etc.

$timestamp=strtotime("+7 Days"); $nowtime =  date('Y-m-d H:i:s', $timestamp); 
like image 37
Sol Avatar answered Oct 18 '22 11:10

Sol