Ruby on rails ActionController::TestCase作为UTC插入,但select返回声明为UTC的本地时间 太长,读不下去了
我有一个RoR 3应用程序,它运行在我正在为其编写功能测试的PostgreSQL数据库上。我注意到一些奇怪的事情,这导致了很多测试问题:时间从select返回,转换成我的本地时间,但声称是UTC 基本上,当我运行测试时,我会创建如下时间:Ruby on rails ActionController::TestCase作为UTC插入,但select返回声明为UTC的本地时间 太长,读不下去了,ruby-on-rails,timezone,functional-testing,testunit,Ruby On Rails,Timezone,Functional Testing,Testunit,我有一个RoR 3应用程序,它运行在我正在为其编写功能测试的PostgreSQL数据库上。我注意到一些奇怪的事情,这导致了很多测试问题:时间从select返回,转换成我的本地时间,但声称是UTC 基本上,当我运行测试时,我会创建如下时间: appointment_time = 1.day.from_now 打印输出会将约会时间输出 2014-01-08 20:08:14 UTC 但是,当我在插入数据库并打印出来后,在那个时间进行选择时,会显示professional.appointment\u
appointment_time = 1.day.from_now
打印输出会将约会时间输出
2014-01-08 20:08:14 UTC
但是,当我在插入数据库并打印出来后,在那个时间进行选择时,会显示professional.appointment\u时间
2014-01-08 15:08:14 UTC
请注意有5个小时的差异-这是有道理的,因为我在东部标准时间,比UTC晚5个小时。但也要注意返回的时间声称是UTC-因此它似乎是在EST中,但认为它是在UTC中
尽管我的application.rb文件包含
# configure the default timezone for app and db
config.time_zone = 'UTC'
config.active_record.default_timezone = 'UTC'
更多信息和代码
以这些课程为例:
def Professional
has_many :appointments
end
def Appointment
belongs_to :professional
attr_accessible :start_time
end
以及AppointController.rb中的以下代码片段:
在专业控制器测试中,我有以下几点
test 'add conflicting appointment returns conflict' do
professional = create(:professional)
start_time = 1.day.from_now
post :create, { professional_id: professional.id, appointment: { start_time: start_time } }
puts "ORIGINAL TIME: #{start_time}"
puts "SELECTED TIME: #{professional.appointments.first.start_time}"
assert_response :success
post :create, { professional_id: professional.id, appointment: { start_time: start_time } }
assert_response :conflict
end
此测试应通过,因为要创建的第一个post将创建一个约会,而该约会将导致第二个post由于调用冲突而返回冲突?但它失败了,因为第二个响应实际上是成功的!此处的输出如下所示:
原始时间:2014-01-08 20:08:14 UTC
选定时间:2014-01-08 15:08:14 UTC
同样,我在东部时间,比UTC晚5个小时,所以我可以想象看到这样的情景:
2014-01-08 15:08:14美国东部时间
这很有道理,但似乎在某个地方时间被转换为EST,但仍然认为是UTC
如前所述,my application.rb有以下两行:
config.time_zone = 'UTC'
config.active_record.default_timezone = 'UTC'
所以我今天在一个不同的场景中偶然发现了这一点。原来 config.active\u record.default\u时区 默认为:local,如果您传递任何它不理解的内容。而且它不理解UTC,这是我传递给它的!由于config.time_zone=UTC有效,因此存在一些差异。要将其设置为UTC,您必须通过“UTC”: config.active\u record.default\u时区=:utc 因此,我的application.rb现在包含:
config.time_zone = 'UTC'
config.active_record.default_timezone = :utc
config.time_zone = 'UTC'
config.active_record.default_timezone = :utc