To summarize, Ruby’s
Time class has a bug in its
zone method. The example is
tz = ENV['TZ'] ENV['TZ'] = 'Africa/Luanda' t = Time.now puts t.zone ENV['TZ'] = 'Australia/Lord_Howe' puts t.zone
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:
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
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
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.