ruby-on-rails – 在显示日期时,让Rails忽略夏令时

我在我的Rails应用程序中有一个以UTC格式存储的日期,并且我正在尝试将其显示给以“东部时间(美国和加拿大)”作为其时区的用户.问题是导轨不断将其转换为东部夏令时(EDT),因此午夜显示为早上8点,应该是早上7点.反正有没有阻止DST转换?
>> 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的方法进行了改进.我不是添加太多rails帮助器的忠实粉丝所以我扩展了活动支持的TimeWithZone类.

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

现在我可以做time.in_time_zone(“东部时间(美国和加拿大)”).no_dst

解决方法

创建一个帮助器,利用TimeZone上的 dst?方法检查传递的时区当前是否在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

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...