In honor of the time change this weekend, today’s Ruby Tuesday is on Time#utc.
In the past few years I have had to deal with numerous bugs crop up around the changes between Daylight time and Standard time. In honor of all the time conversion issues I have dealt with in the past couple of years, I thought it would be timely, pun absolutely intended, to explore time conversions. As as this deals with local time vs UTC time conversions, let me preface this with a warning:
Here there be dragons.
With that said, let us see if we can channel the spirit of Dirk the Daring, and attempt to face down some of those dragons.
For this upcoming time change we will be moving the clocks forward an hour at 2 AM.
Let’s see what time it is right before the time change.
Time.new(2015,3,8, 1,59,59).utc # 2015-03-08 07:59:59 UTC
And when 2 AM “arrives”, we move the clock forward and it becomes 3 AM.
Time.new(2015,3,8, 3,00,00).utc # 2015-03-08 08:00:00 UTC
So far, all that looks good. But what happens at 2 AM?
Time.new(2015,3,8, 2,00,00).utc # 2015-03-08 08:00:00 UTC
Though 2 AM on March 8th of 2015 never really happens, at least here in the Dallas/Fort Worth area, we do get a valid time returned when we call
Time#utc, and the result is the same as when we called the
utc method for 3AM.
That was interesting; as far if that is good or bad, that depends on how well your system can handle that behavior.
Now onto what happens later in the year when we set our clocks back an hour.
The first time that 2 AM rolls around we set our clocks back an hour to 1 AM, so let’s see what time 12:59:59 AM is in UTC, since we know that only happens once.
Time.new(2015,11,1, 00,59,59).utc # 2015-11-01 05:59:59 UTC
And we only hit 2 AM only once as well, since the first time we came to 2 AM we all skipped it and relived the 1 AM hour.
Time.new(2015,11,1, 2,00,00).utc # 2015-11-01 08:00:00 UTC
So now the question is: “What time is it at 1 AM?”
Time.new(2015,11,1, 1,00,00).utc # 2015-11-01 07:00:00 UTC
It looks like we only get the time for 1 AM for the second time it rolls around, as it returns 7 AM UTC, and we have completely lost the 6 AM UTC hour. Dragons!
Hopefully you can avoid most of these issues and just work in UTC or epoch seconds across your systems. But as our systems continue to interact with more and more outside systems, the likelihood of having to deal with these issues increase, so please be aware.