我们最近将rails应用程序从rails 3.2和ruby 1.9.3升级到rails 4.2.7和ruby 2.3.1。但我遇到了Oracle时间戳字段的问题。它忽略Time.use_zone设置的时区。但是日期字段仍然可以像以前的版本一样工作。
CREATE TABLE TESTS
( ID VARCHAR2(20) NOT NULL
, TIMESTAMP_FIELD TIMESTAMP
, DATE_FIELD DATE
, CONSTRAINT TEST_PK PRIMARY KEY
( ID )
ENABLE
);
rails c(在我们的rails 4.2应用程序中)
> Test.create(id: 1, timestamp_field: Time.now, date_field: Time.now)
#<Test id: "1", timestamp_field: "2016-08-18 17:06:51", date_field: "2016-08-18 15:06:51">
> puts Test.find_by_id(1).timestamp_field
2016-08-18 17:06:51 +0200
> puts Test.find_by_id(1).date_field
2016-08-18 17:06:51 +0200
> x = Proc.new { puts Test.find_by_id(1).timestamp_field }
> Time.use_zone('Adelaide', &x)
2016-08-18 17:06:51 +0200
> x = Proc.new { puts Test.find_by_id(1).date_field }
> Time.use_zone('Adelaide', &x)
2016-08-19 00:36:51 +0930
在rails 3.2中,timestamp_field确实受到Time.use_zone的影响,并且在使用Time.use_zone时显示与date_field相同的时间。
更新
application.rb中
config.time_zone = 'Amsterdam'
config.active_record.default_timezone = :local
更新
> Test.find_by_id(1).timestamp_field.class
Time
> Test.find_by_id(1).date_field.class
ActiveSupport::TimeWithZone
因此,问题是由这些对象的不同实现引起的。奇怪的是它是一个Time对象,而不是一个ActiveSupport对象