我正在尝试让我的验证阻止用户创建将来不存在的Appointment
。我的验证工作是阻止创建过去的约会,但它也阻止用户今天创建约会,这应该被允许。这有什么不对?
Appointment.rb:
validates :pickuptime, presence: true
validate :pickuptime_is_in_future
byebug
def pickuptime_is_in_future
if pickuptime < Time.now
errors.add(:pickuptime, "Appointment must be in the future")
end
end
我调试了这个(使用byebug
),在byebug
行的位置,我发现了以下内容:
(byebug) Time.now
2014-12-20 20:33:35 -0500
(byebug) pickuptime
Sat, 20 Dec 2014 21:34:00 UTC +00:00
(byebug) pickuptime < Time.now
true
如果Time.now是晚上8:33并且接送时间是晚上9:34,为什么会这样呢?
非常感谢任何帮助,谢谢!
答案 0 :(得分:2)
您的时区未设置。
可以使用
获取所有可用时区的列表rake time:zones:all
并设置您的时区。
# application.rb:
class Application < Rails::Application
config.time_zone = 'Eastern Time (US & Canada)'
end
由于Time Zones和您的本地系统UTC Offset,您看到了不同之处。
(byebug) Time.now
2014-12-20 20:33:35 -0500
此时间是UTC时间-05:00小时或5小时
(byebug) pickuptime
Sat, 20 Dec 2014 21:34:00 UTC +00:00
此时间为UTC时间00:00或0小时
(byebug) pickuptime < Time.now
true
因此,这是正确的,因为您的当地时间实际上是
Sun, 21 Dec 2014 01:33:35 UTC +00:00
而pickuptime
是
Sat, 20 Dec 2014 21:34:00 UTC +00:00
并且因为您的时区未设置而发生。为此,请按照以下说明。
可以使用
获取所有可用时区的列表rake time:zones:all
并设置您的时区。详见ActiveSupport::TimeZone
# application.rb:
class Application < Rails::Application
config.time_zone = 'Eastern Time (US & Canada)'
end