6

我在我的 Rails 应用程序中有一个以 UTC 格式存储的日期,并试图将其显示给拥有"Eastern Time (US & Canada)"时区的用户。问题是 Rails 不断将其转换为东部夏令时间 (EDT),因此午夜显示为8am而应该是7am。有没有办法阻止夏令时转换?

>> 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

更新

我最终改变了@zeantsoi 的方法。我不喜欢添加太多的导轨助手,所以我扩展了主动支持的TimeWithZone课程。

class ActiveSupport::TimeWithZone
  def no_dst
    if self.dst?
      self - 1.hour
    else
      self
    end
  end
end

现在我可以做time.in_time_zone("Eastern Time (US & Canada)").no_dst

4

1 回答 1

2

创建一个助手,利用dst?on 方法TimeZone检查传递的时区当前是否在 DST 中。如果是,则从提供的DateTime实例中减去一个小时:

# 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

然后,在您的视图中渲染调整(或未调整)的时间:

# 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
于 2013-08-30T21:37:16.863 回答