为什么在Thread内部将Time.zone设置为nil

时间:2016-07-12 11:14:17

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

这就是我的意思......

require 'rubygems'
gem 'activesupport','4.2.6'
require 'active_support/all'

Time.zone = 'EST'
puts "Print the current Time zone -- [#{Time.zone}]"

Thread.new do 
  puts "Time zone(will be nil) instead thread -- [#{Time.zone}]"
end

sleep 1

O / P

Print the current Time zone -- ((GMT-05:00) EST)
Time zone(will be nil) instead thread -- ()

显然,对于线程内的Time.zone,rails在这里做了一些魔术。

所以我的问题是......

  1. 为什么Rails正在做这个魔术?

  2. Rails代码中的位置就是这样。(代码的链接会很棒)

2 个答案:

答案 0 :(得分:1)

如果您查看Time.zone,您可以看到它仅针对当前线程设置,因此这似乎是预期的行为。

您可以存储在变量中并以这种方式调用它,或者每次在创建线程时将Time.zone设置为“EST”,然后再调用Time.zone。

以下是正在发生的事情的一个例子

eval

我无法回答为什么Rails会为它所做的许多事情做出魔力,但我相信可能每个线程都可以在不同的时区上运行。

答案 1 :(得分:0)

您需要设置default_zone:

Time.zone_default = Time.find_zone! 'Eastern Time (US & Canada)'