【问题标题】:Rails: Compare DateTime with Time.nowRails:比较 DateTime 和 Time.now
【发布时间】:2014-05-02 11:58:15
【问题描述】:

我确信这非常容易,但由于某种原因我无法理解。我正在使用psqldevise。我有一个 user 模型,它有一个 expiration 列。我想要做的是,当用户登录时,设计也包括过期检查。

我已经覆盖了模型中的 active_for_authentication? 方法,看起来像这样:

def active_for_authentication? 
  super && expiration > Time.now.to_s(:db)
end 

但现在它让每个人都进来了……

帮助我 Stackoverflow,你是我唯一的希望!

编辑我在更新之前这样设置过期时间,其中amount 是一个动态变量:

self.expiration = amount.weeks.from_now

EDIT 2 Rails 控制台这样说:

#<User:xxx> {:expiration => Mon, 24 Mar 2014 19:19:42 UTC +00:00}

2.0.0p0 :013 > Time.now 2014-03-24 13:10:47 -0700

显然它们是不同的,这就是为什么我认为它们不起作用。我想知道的是是否缺少一些简单的转换,例如:.to_s(:db) 或者我是否必须进行某种字符串比较。

【问题讨论】:

  • 你为什么说self.expirationDateTime?为什么3.weeks.from_now > Time.now 不会返回true?...我有什么问题吗?
  • 因为数据库中的列是日期时间格式。 (这可能不正确,但我认为应该是这样)
  • 试试3.weeks.from_now.class #=> ActiveSupport::TimeWithZone,还有User.last.created_at.class #=> ActiveSupport::TimeWithZone

标签: ruby-on-rails postgresql datetime devise


【解决方案1】:

不要比较字符串,让它按时间比较。

def active_for_authentication? super && expiration.to_time > Time.now end

【讨论】:

  • 当我尝试这个时,我得到以下信息:2.0.0p0 :016 > puts "true" if @user.expiration.to_time > Time.now nil 2.0.0p0 :017 > puts @user.expiration.to_time 2014-03-24 19:19:42 UTC nil 2.0.0p0 :018 > puts Time.now 2014-03-24 15:00:32 -0700 nil 2.0.0p0 :019 >
  • 抱歉格式化 - 基本上它返回 nil 而不是 true。看起来区别在于.to_time 返回UTCTime.now 返回-0700
  • 那行不行...试着输入这个:@user.expiration.to_time > Time.now
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多