Oracle时间戳忽略Rails 4.2.7中的Time.use_zone

时间:2016-08-18 15:32:19

标签: ruby-on-rails ruby oracle ruby-on-rails-4

我们最近将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对象

0 个答案:

没有答案