PHP: Calculating past and future datesThe 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 daysThe 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'));
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 weekSometimes we work with days of the week and need to know the last/next occurrence of, for example, a Saturday:
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:
Using offsets to get the right dayAnother 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:
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:
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 FutureThe 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. ReferencesFeedback and Questions11 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! |
||||||||
|
© Copyright 2010 Chirp Internet
- Page Last Modified: 22 November 2009
|
||||||||