skip navigation

PHP: Calculating past and future dates

The strtotime function in PHP is incredibly powerful but very much underutilised - mainly because some aspects can be a bit confusing and people are more confident 'doing things the hard way'. The strtotime function doesn't just convert date strings to timestamp values but also has it's own 'language' to let you specify just about any date or time you want.

Calculating dates for past and future days

The easiest and most common calculations are based on seconds, minutes, hours and days. Months and years are also valid input but not always useful in calculations as they're not all of equal length because of the way our calendar works.

Shown below are the results of various strings passed to strtotime and converted to date strings.

For example:

echo date('l jS F (Y-m-d)', strtotime('-3 days'));
3 days ago
Wednesday 17th March (2010-03-17)
-3 days
Wednesday 17th March (2010-03-17)
-2 days
Thursday 18th March (2010-03-18)
yesterday
Friday 19th March (2010-03-19)
now
Saturday 20th March (2010-03-20)
today
Saturday 20th March (2010-03-20)
tomorrow
Sunday 21st March (2010-03-21)
+2 days
Monday 22nd March (2010-03-22)
+3 days
Tuesday 23rd March (2010-03-23)

As always there are often different ways to achieve the same result. In the list above you can see that '3 days ago' is equivalent to '-3 days'. Also 'yesterday' is the same as '-1 days' or '1 day ago'. The 's' on the end of 'days', 'years' or other measurements can be left off if you want.

The 'now' and 'today' input values in the list above are superfluous as if we leave off the second paramater of the date function it will default to the current time anyway.

Working with days of the week

Sometimes we work with days of the week and need to know the last/next occurrence of, for example, a Saturday:

-2 weeks Saturday
Saturday 6th March (2010-03-06)
last Saturday
Saturday 13th March (2010-03-13)
Saturday
Saturday 20th March (2010-03-20)
this Saturday
Saturday 20th March (2010-03-20)
first Saturday
Saturday 27th March (2010-03-27)
next Saturday
Saturday 27th March (2010-03-27)
third Saturday
Saturday 10th April (2010-04-10)
+2 weeks Saturday
Saturday 3rd April (2010-04-03)

In the list above we can see that 'Saturday', 'this Saturday' and 'first Saturday' are all equivalent. The 'this' and 'first' keywords are only used to improve readability.

Now it gets a bit complicated to explain. The following appears on the PHP website:

In PHP 5 up to 5.0.2, "now" and other relative times are wrongly computed from today's midnight. It differs from other versions where it is correctly computed from current time.

In addition, they've introduced 'second' as in 'second Saturday' and seem to have changed the meaning of 'next' to mean the same as 'first'. Finally, the return value on failure is now FALSE instead of -1. This last change is the most likely to cause problems in legacy applications.

The table below shows how the output has changed:

Older versions of PHP: PHP 5.0.2 and higher:
  • last Saturday
  • this Saturday or first Saturday
  • next Saturday
  • third Saturday
  • fourth Saturday
  • last Saturday
  • this Saturday or first Saturday or next Saturday
  • second Saturday
  • third Saturday
  • fourth Saturday

Using offsets to get the right day

Another problem is when you want to find the previous or next occurence of a certain day of the week. For example, today being a Saturday we can run the following:

last Saturday
Saturday 13th March (2010-03-13)
Saturday
Saturday 20th March (2010-03-20)
this Saturday
Saturday 20th March (2010-03-20)
first Saturday
Saturday 27th March (2010-03-27)
next Saturday
Saturday 27th March (2010-03-27)
third Saturday
Saturday 10th April (2010-04-10)
Older versions of PHP: PHP 5.0.2 and higher:
  • last Saturday
  • this Saturday or first Saturday
  • next Saturday
  • third Saturday
  • fourth Saturday
  • last Saturday
  • this Saturday
  • first Saturday or next Saturday
  • second Saturday
  • third Saturday

You can see in the table above that, while 'next Saturday' returns the same result, the 'first', 'second', 'third', ... modifiers have all changed in meaning - thankfully to a more logical state.

You may notice also that this only occurs when you're calculating from the current day and not in the previous examples (unless today is Saturday). Whenever you do calculations based on days you should test as many possibilities as possible: Does it work today? yesterday? tomorrow? and so on.

Sometimes you want to find the last occurence of a day before today, or before yesterday or before 2 days ago. The following examples show the syntax you can use for this:

-3 days last Saturday
Wednesday 10th March (2010-03-10)
-2 days last Saturday
Thursday 11th March (2010-03-11)
yesterday last Saturday
Friday 12th March (2010-03-12)
tomorrow Saturday
Sunday 21st March (2010-03-21)
+2 days Saturday
Monday 22nd March (2010-03-22)
+3 days Saturday
Tuesday 23rd March (2010-03-23)

Now that you understand the inner workings of strtotime you should be able to drastically reduce the amount of code required to calculate past and future dates.

Checking if a date is in the Past or Future

The strtotime function returns an integer value so it's a simple matter to see if a date is in the past or in the future.

if(strtotime(dateString) > time()) { # date is in the future } if(strtotime(dateString) < time()) { # date is in the past } if(strtotime(dateString) == time()) { # date is right now }

Note: time() is equivalent to date('U') and returns the current timestamp to the nearest second.

You might want to replace time() with strtotime('0:00') if you want to compare a date string to the current date rather than the current date and time.

References

< Back to PHP


Bookmark and Share

Feedback and Questions

11 September 2007: Tony D says:

The tutorial is really helpful, but some code would be nice. I need a function to tell me if some MYSQL date is between now and the upcoming Sunday. Any help?

In MySQL you can convert a date to a UNIX timestamp using the UNIX_TIMESTAMP function. That value can then be checked to see whether it falls between time() and strtotime('this Sunday').


31 March 2008: Renee says:

This tutorial has helped me with several projects. Thank you!


13 October 2008: patrick says:

Thanks. I was prepared to insert several lines of code to change current date to (+ 7 days).. with your suggestions I've made it in a few characters. Well done!


[top]