If you’ve ever dealt with time in PHP you’ve probably been burnt by daylight
savings time before (quite possibly yesterday ;). I’ve been there, waking up on
the Sunday of the time change with an email about timestamps being an hour off
or some other anomaly that ends up being related to the time change.
PHP does provide a way to check if a time is in daylight savings time or not,
it’s as simple as using a capital i as the format:
if (date('I', time())) {
echo 'We are in DST!'
} else {
echo 'We are not in DST!'
}
Once you know if you’re in daylight savings time, you can adjust your logic flow
accordingly.
Now this is great when you’re attempting to address some hardcoded issue in your
code, but it’s not all that ideal in my opinion. These days I opt to store any
and all timestamps in GMT or UTC and avoid daylight savings time all together.
Doing this presents it’s own set of challenges and adds some complexity to your
coding.
First, you’ll want to make sure you’re working with the correct time. One method
would be to set the timezone in PHP to either GMT
or UTC
in php.ini
or by
using date_default_timezone_set()
. The other approach would be to using
gmdate()
in place of date()
. Same arguments, a few hours difference in the
results.
Once you’re ensuring that you don’t have regional time being stored, you will
need to address how your users are seeing the date. One trick of mine is to only
show relative time, like “1 hour ago” instead of the actual time. By doing this,
I can completely avoid converting the time, definitely the path of least
resistance.
If you don’t opt for relative time, you will have a bit more work ahead of you
to ensure you’re displaying the correct time for your users. First, you’ll need
to make the decision as to whether you will show them time in their timezone or
if you’ll pick a single timezone (let’s say Pacific time like Google).
Regardless of what you pick, you will need to force the use of timezone. As
previously mentioned you can do so by setting the timezone in php.ini (if you
decide to use a single timezone) or use date_default_timezone_set()
before you
call date()
to set it to the user’s timezone:
date_default_timezone_set('US/Pacific'
echo date('r', $utc_timestamp
There’s a few different approaches discussed here, as mentioned my personal
favorite method is to store everything in GMT and then display the user with
relative times. How do you handle timezone and daylight savings time
differences? Got any horror stories related to DST? Comment below!