Rails模型属性(DateTime)具有不同的值,具体取决于其调用方式

时间:2016-01-05 20:45:08

标签: ruby-on-rails ruby datetime activerecord rails-activerecord

我正在使用Rails 4.2和Ruby 2.2.0。我有一个名为Ride的模型,它有一个名为start_time的DateTime属性。当我呼叫Ride.find(1803)时,start_time显示为1月9日。但是当我调用Ride.find(1803).start_time时,它会在1月9日返回start_time。这怎么可能,我该如何解决?这是我在控制台中运行的完整代码:

irb(main):028:0> Ride.find(1803)
=> #<Ride id: 1803, start_time: "2016-01-09 00:00:00", end_time: nil, created_at: "2016-01-05 16:55:44", updated_at: "2016-01-05 20:35:38", user_id: 29, ride_type: nil, horse_id: nil, notes: "", available_to_ride_additional_horses: nil, admin_approved: false, weekday: nil, unavailable_to_ride: false, time_range_dropdown: "Morning", rider_name: "Matti Fisher", rider_last_name: "Fisher", rider_first_name: "Matti", edited_at: nil, requested_time: "2016-01-09 19:30:00">
irb(main):029:0> Ride.find(1803).start_time
=> Fri, 08 Jan 2016 19:00:00 EST -05:00

1 个答案:

答案 0 :(得分:4)

这是因为日期/时间值以UTC格式存储在数据库中,ActiveRecord模型的默认实现inspect不适用于任何时区转换。

但是,当您访问日期/时间值时,Rails将应用当前时区设置。

你可以做数学。由于您的时区是UTC-5,因此两个datetime代表相同的对象

2016-01-09 00:00:00 UTC
Fri, 08 Jan 2016 19:00:00 EST -05:00

作为证明,您可以致电

Ride.find(1803).start_time.utc

并且您将获得UTC的日期/时间,这可能与您在打印完整记录表示时看到的值相同。