Reputation: 22478
I have a date stored in UTC in my Rails app and am trying to display it to a user who has "Eastern Time (US & Canada)"
as their timezone. The problem is that rails keeps converting it to Eastern Daylight Time (EDT) so midnight is being displayed as 8am when it should be 7am. Is there anyway to prevent the DST conversion?
>> time = DateTime.parse("2013-08-26T00:00:00Z")
=> Mon, 26 Aug 2013 00:00:00 +0000
>> time.in_time_zone("Eastern Time (US & Canada)")
=> Sun, 25 Aug 2013 20:00:00 EDT -04:00
I eventually went with a twist on @zeantsoi 's approach. I'm not a huge fan of adding too many rails helpers so I extended active support's TimeWithZone
class.
class ActiveSupport::TimeWithZone
def no_dst
if self.dst?
self - 1.hour
else
self
end
end
end
Now I can do time.in_time_zone("Eastern Time (US & Canada)").no_dst
Upvotes: 6
Views: 2773
Reputation: 26193
Create a helper that utilizes the dst?
method on TimeZone
to check whether the passed timezone is currently in DST. If it is, then subtract an hour from the supplied DateTime
instance:
# helper function
module TimeConversion
def no_dst(datetime, timezone)
Time.zone = timezone
if Time.zone.now.dst?
return datetime - 1.hour
end
return datetime
end
end
Then, render the adjusted (or non-adjusted) time in your view:
# in your view
<%= no_dst(DateTime.parse("2013-08-26T00:00:00Z"), 'Eastern Time (US & Canada)') %>
#=> Sun, 25 Aug 2013 19:00:00 EDT -04:00
Upvotes: 2