我有一个应用程序可以根据一天中的时间更改行为,我希望能够启动服务器并测试它在不同时间的工作方式。
理想情况下,当我运行rails s
时,我希望能够将时间作为参数传递,例如rails s TIME=2014-02-26 22:06:11 -0500
。
答案 0 :(得分:2)
在config / locales / application.rb中,您可以在运行rails s之前设置时区。
config.time_zone = 'Alaska'
如果您正在运行OS X,您还可以在运行rails之前在终端中设置系统时间。
date 022611002013
格式为[月] [日] [hh] [mm] [年],因此以上是2013年2月26日11:00。您可以将系统时间更改回终端或日期中的当前时间和时间偏好面板。
答案 1 :(得分:1)
Rails服务器使用主机的时间。因此,如果您在本地计算机上运行,那么更改本地操作系统的时间也会对您的rails服务器产生影响
如果它托管在另一台服务器上,那么你必须改变该服务器的时间。
答案 2 :(得分:1)
请勿尝试更改服务器的时间。这可能会对cron工作或其他基于时间的服务造成严重破坏。
相反,您是否尝试将开始时间定义为代码中的特定值,然后运行服务器?然后将其设置为下次需要,然后再次运行服务器?
Time.new(2013, 12, 31, 12, 59, 59) # => 2013-12-31 12:59:59 -0700
您还可以将时间用作整数,使用表示您希望服务器认为的时间的秒数。将其作为ENV
哈希元素传递,然后检查它是否已定义。如果是,则根据该值定义时间,否则不定义ENV
值,服务器将正常运行:
ENV['SERVER_TIME'] = '1388519999'
server_time = ENV['SERVER_TIME'] ? Time.at(ENV['SERVER_TIME'].to_i) : Time.now
server_time # => 2013-12-31 12:59:59 -0700
然后,当您需要测试服务器时,您可以编写一个小shell脚本来设置该值并运行rails s
,测试服务器然后退出它,然后使用不同的值重新运行shell脚本。 / p>
答案 3 :(得分:1)
您实际上可以从rails(实际上是Ruby)中读取环境变量。这是怎么做的:
require 'date'
$startup_time = DateTime.parse(ENV['STARTUP_TIME']) rescue DateTime.now
puts "Server started at: #{$startup_time}"
您可以将此代码称为pull_time.rb
,如下所示:
STARTUP_TIME="2014-02-26 22:06:11 -0500" ruby pull_time.rb
为了让这个全局变量在Rails中起作用,你想将它添加到初始化器中。
所以将上面的代码放在config/initializers/set_startup_time.rb
您现在可以在代码中的任何位置访问$startup_time
。只需将STARTUP_TIME
作为环境变量传递给rails。
STARTUP_TIME=2014-02-26 22:06:11 -0500 rails s
答案 4 :(得分:0)
Rails服务器确定来自主机的时间
因此改变系统的时间就可以了解
修改强> 作为' sevenseacat'在评论中说:
您还可以使用gem timecop测试您的应用,而无需更改系统的时间。
答案 5 :(得分:0)
您可以通过将config.time_zone = 'Pacific'
添加到application.rb
来更改Rails的内部时区。
如果您要部署到Heroku,您可以采用稍微不同的方式:heroku config:add TZ="Europe/Athens"
。
然而,缺点是这些命令都不允许您为应用程序定义特定的时间(只是时区,因此您可以在另一个时区获得当前时间),也无法运行这些来自命令行,在启动本地Rails服务器时。