Heads up! To view this whole video, sign in with your Courses account or enroll in your free 7-day trial. Sign In Enroll
Preview
Start a free Courses trial
to watch this video
There are a lot of things that can catch you out when working with time zones, but PHP has you covered with built in Time Zone support for the DateTime class.
Related Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign upRelated Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign up
Time zones can be a very difficult aspect
of web development to understand.
0:00
There are different time zones all over
the world and
0:03
most of these time zones are not as
logical as you would hope.
0:06
Every country has a different time and
0:09
you want to make sure that you're showing
the user in that country the right time.
0:11
There are some tricky caveats.
0:14
Not all time zones are exactly one hour
plus or minus UTC.
0:17
So storing a plus or minus integer doesn't
work.
0:20
Not all time zones have daylight savings
time.
0:22
Political events can cause time zones to
change their off set.
0:25
Many developers approach this by always
storing dates in their databaseβs UTC.
0:29
Any date going in is converted to UTC on
input, and back from UTC on display.
0:33
To calculate times and offsets, many
developers store plus 1 or
0:39
minus 4 as an offset and put that in their
database as an integer.
0:42
This means that if the country's offset is
minus four and
0:46
a half hours, then the numeric
representation is minus 4.5.
0:49
This is a decimal, and if you try to put
decimal numbers into an integer field,
0:52
it'll be truncated by MySQL and only the
value 4 will be saved.
0:57
Even storing a decimal number would not
help if DST or
1:02
time zone change came into effect.
1:05
The time being displayed to the user would
still be wrong by as much as an hour.
1:07
The more robust way to work with dates and
times in PHP,
1:12
is to store the actual time zone in the
database and not just the offset.
1:15
PHP uses IANA time zones which are an
internationally recognized body in
1:19
charge of handling mapping of these times
zones and keeping them up to date.
1:24
Let's take a look at some code.
1:28
First this might look like a lot of code,
but when broken down it's pretty simple.
1:30
On line 3 we have a new date/time object
just as before, using a supported format.
1:33
We've also specified the second argument
of the date time class which is
1:37
an instance of date time zone.
1:41
This accepts a string with a name of a
time zone, and
1:43
UTC is the one we want here.
1:45
Next we clone that date so we can keep a
copy of the original.
1:47
We do this because date time is a mutable
class.
1:50
That means the object will change state
when we run methods like set time zone.
1:53
So that we can keep a copy we have to
fully clone the object.
1:57
Then work with a brand new version.
2:00
On line 7,
2:02
we now use the set time zone method on our
new copy of the UTC date/time instance.
2:03
And the string American New York is a
supported IANA time zone name.
2:08
This will update the local date/time
object to have a new time zone and
2:12
therefore a new time.
2:16
Finally, at the bottom of the script,
weβre outputting two
2:17
paragraphs with the date and time for UTC
and another for the time in New York.
2:21
Letβs have a look at that in the preview.
2:26
Great, it looks like that worked.
2:30
1314 in UTC is now showing 0914 in New
York, which is exactly right.
2:32
All dates should be stored as UTC in the
database.
2:37
The date should always be displayed to the
user in their own time zone.
2:39
This sounds complicated.
2:42
But it simply means you need to convert
from UTC to the local time zone
2:43
for output.
2:46
Then convert from the local time zone to
UTC on input.
2:47
Let's get back to our workspace and see
what that code might look like.
2:50
This is basically the same piece of code
we had before.
2:53
We just swapped things around.
2:55
Now it's worth noting that you'll probably
take your input from a superglobal such
2:56
as a post variable.
3:00
But, for the sake of simplicity, we're
going to use just a raw variable here.
3:01
Now, the rest of this is pretty much the
same.
3:05
We're creating a local date/time from the
American New York timezone.
3:08
We're cloning that to make a UTC date time
object, and
3:13
then we're setting the time zone of that
to UTC.
3:15
So now if we run this, it should look
exactly the same as before.
3:19
Perfect.
We've still got 13 o'clock and
3:24
we have nine o'clock right there.
3:26
By storing the time zone name itself the
various offsets for
3:29
day light savings time or [UNKNOWN]
changes are handled for you.
3:32
All you then need to do is store all dates
in UTC and update the one output.
3:35
So, just remember, all dates are stored in
a database as UTC.
3:39
All users should have a time zone attached
to their own account.
3:43
That time zone should be a valid IANA
name, and whenever you output dates,
3:45
you need to set the time zone of that date
to match the user's time zone.
3:51
Let's try a few questions on UTC and time
zones.
3:54
You need to sign up for Treehouse in order to download course files.
Sign upYou need to sign up for Treehouse in order to set up Workspace
Sign up