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
Tuesday 31st August (2010-08-31)
-3 days
Tuesday 31st August (2010-08-31)
-2 days
Wednesday 1st September (2010-09-01)
yesterday
Thursday 2nd September (2010-09-02)
now
Friday 3rd September (2010-09-03)
today
Friday 3rd September (2010-09-03)
tomorrow
Saturday 4th September (2010-09-04)
+2 days
Sunday 5th September (2010-09-05)
+3 days
Monday 6th September (2010-09-06)

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 21st August (2010-08-21)
last Saturday
Saturday 28th August (2010-08-28)
Saturday
Saturday 4th September (2010-09-04)
this Saturday
Saturday 4th September (2010-09-04)
first Saturday
Saturday 4th September (2010-09-04)
next Saturday
Saturday 4th September (2010-09-04)
third Saturday
Saturday 18th September (2010-09-18)
+2 weeks Saturday
Saturday 18th September (2010-09-18)

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 Friday we can run the following:

last Friday
Friday 27th August (2010-08-27)
Friday
Friday 3rd September (2010-09-03)
this Friday
Friday 3rd September (2010-09-03)
first Friday
Friday 10th September (2010-09-10)
next Friday
Friday 10th September (2010-09-10)
third Friday
Friday 24th September (2010-09-24)
Older versions of PHP: PHP 5.0.2 and higher:
  • last Friday
  • this Friday or first Friday
  • next Friday
  • third Friday
  • fourth Friday
  • last Friday
  • this Friday
  • first Friday or next Friday
  • second Friday
  • third Friday

You can see in the table above that, while 'next Friday' 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 25th August (2010-08-25)
-2 days last Saturday
Thursday 26th August (2010-08-26)
yesterday last Saturday
Friday 27th August (2010-08-27)
tomorrow Saturday
Sunday 5th September (2010-09-05)
+2 days Saturday
Monday 6th September (2010-09-06)
+3 days Saturday
Tuesday 7th September (2010-09-07)

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


User Comments and Notes

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!


Send Feedback

Send Your Feedback (will not be published) (optional) CAPTCHA refresh copy the digits from the image into this box

[top]