Ruby on rails RubyonRails。时区和范围

Ruby on rails RubyonRails。时区和范围,ruby-on-rails,datetime,scope,timezone,Ruby On Rails,Datetime,Scope,Timezone,我需要帮助尝试在范围内使用时区。下面是我试图实现的一个例子 所有日期都存储在UTC时间: 例如,时区UTC+1中的用户发布了一个将在20:00开始的gig。在gig show页面上,每个人都会看到这是20:00,这是正确的。 我的问题是,我必须“过期”演出,所以在日期过去后,它们不再出现在搜索中 到目前为止,我一直在使用示波器 scope :expired, -> { where('date <= ?', Time.current.to_datetime) } Rails仍然会在U

我需要帮助尝试在范围内使用时区。下面是我试图实现的一个例子

所有日期都存储在UTC时间:

例如,时区UTC+1中的用户发布了一个将在20:00开始的gig。在gig show页面上,每个人都会看到这是20:00,这是正确的。 我的问题是,我必须“过期”演出,所以在<代码>日期过去后,它们不再出现在搜索中

到目前为止,我一直在使用示波器

scope :expired, -> { where('date <= ?', Time.current.to_datetime) }
Rails仍然会在UTC时间内“终止”GIG。
如何添加GIGS保存的时区,并在范围内使用它?

< P>我从未使用过时区GEM,但是如果在一个范围内使用它有困难,您可以考虑简单地使用它来返回您想要的方法。 Fwiw,如果你为不同的时区保存不同的时间,我认为你可能会使你的应用程序难以维护。我可以看到向用户显示一个转换为时区的日期……但它们应该以统一的方式保存。这段代码,如果它依赖于当前用户的时区,将很难实现。比较不同的苹果是很重要的

如何保存日期?如果它被保存为UTC时间,只需将其与UTC时间进行比较

如果您喜欢使用范围,我会这样做:

scope :expired, -> { where('date < ?', Date.today) }
def self.expired
  Gig.where('date < ?', Date.today)
end
范围:过期,->{where('date<?',date.today)}
或者,您可以这样做:

scope :expired, -> { where('date < ?', Date.today) }
def self.expired
  Gig.where('date < ?', Date.today)
end
def self.expired
演出地点(“日期<?”,日期:今天)
结束

好的,经过几天的努力,我想出了一个解决方案。如果有人能做得更好,我很想听听

在gig创建时,我使用时区gem查找时区,并将生成的
:字符串
保存到我在gig模型中创建的
时区
属性中
经度
纬度
可作为属性使用,因为gig具有在创建表单中设置的位置

timezone = Timezone.lookup(@gig.latitude, @gig.longitude)
          @gig.update_attributes(timezone: timezone)
然后,我在gig模型中添加了另一列
gigzonetime
。我将其设置为gig.date,并减去时区偏移量

 gigzonetime = @gig.date - @gig.date.in_time_zone(@gig.timezone).utc_offset
  @gig.update_attributes(gigzonetime: gigzonetime)
在“显示”和“索引”页面上,我显示
以显示它将显示的本地时间,并在我的范围内与新属性
gigzonetime
进行比较,以便它在正确的时间过期

scope :expired, -> { where('gigzonetime <= ?', Time.current.to_datetime) }

作用域:过期,->{where('gigzonetime这些范围对我来说没有意义-例如,在第二个例子中,self应该是什么?我还认为基本前提是,为了列出过期的Gig,你需要进行时区转换是不正确的。哦,天哪,你是对的。我工作了一整天,大脑在睡觉,但现在你指出了,我看到copes没有意义!我现在就更改它们。你还指出基本前提不正确--你有什么建议?嘿,谢谢你的回答,但我认为你没有正确理解我。所有时间都保存在UTC。例如,我住在UTC+1,我发布了一份20:00的gig。查看gig的用户可以看到20:00,这很好,但是当我需要“过期”它时,它会在UTC时间20:00过期,即UTC时间21:00+1。我需要在gig自己时区的20:00过期。在这种情况下,时区对于检查过期根本不重要。如果它保存在UTC中,您应该检查它是否在UTC中过期。只有用户需要查看转换的时间。但是如果我在UT中过期它C对于非UTC用户,它不会在正确的时间过期。我的时区是UTC+1,我刚刚制作了一个gig,日期为今天13:20。使用“gig.where('date<?,date.today)”“对我来说,它在14:20过期,而不是13:20。这是不正确的。我要么需要在相关时区过期,要么在相关时区保存。我认为在UTC保存所有内容会比较简单。无论如何,我已经更新了原始问题,希望它更有意义。”。