Ruby Time Object Time Zone Bug
To summarize, Ruby’s Time
class has a bug in its zone
method. The example is
simple:
tz = ENV['TZ']
ENV['TZ'] = 'Africa/Luanda'
t = Time.now
puts t.zone
ENV['TZ'] = 'Australia/Lord_Howe'
puts t.zone
This outputs:
WAT
WAT
So far so good. But look what happens when I add a single line to the program,
foo = t.to_s
:
tz = ENV['TZ']
ENV['TZ'] = 'Africa/Luanda'
t = Time.now
puts t.zone
ENV['TZ'] = 'Australia/Lord_Howe'
foo = t.to_s
puts t.zone
The result changes:
WAT
LHST
This is clearly wrong. Changing the $TZ
environment variable and stringifying
the object should not change the underlying value of any of the object’s
attributes. The Time
object should remember the value of the time zone when it
is initialized, and should never change.
Unfortunately, The Ruby core developers (or at least the owner of the bug
report) feel that, since Time
relies on the system C API, and since time zones
are a PITA, it’s not worth it to change this behavior. The downside, however, is
that you cannot rely on Time
zones to ever be correct unless you’re very, very
careful.
Personally, in my subclass of Time
, I took care of stashing the time zone at
object instantiation as a workaround for this bug. It seemed reasonable to me,
and I was just surprised that the idea was rejected by the Ruby developers.
What do you think?
Looking for the comments? Try the old layout.