Rails如何知道我的时区?

Rails如何知道我的时区? 我没有在application.rb设置它:

 # config.time_zone = 'Central Time (US & Canada)' 

我在整个应用程序中搜索了time_zone ,这是它的唯一实例。 我没有看到时区设置的任何环境变量。 我在Windows上。

 C:\Users\Chloe\workspace\MyBestBody>rails runner "p Time.now" DL is deprecated, please use Fiddle 2015-06-12 23:38:33 -0400 

它在部署到Heroku时打印UTC时间。

 C:\Users\Chloe\workspace\MyBestBody>heroku run rails console Running `rails console` attached to terminal... up, run.1949 Loading production environment (Rails 4.2.1) irb(main):001:0> Time.new => 2015-06-13 03:28:34 +0000 

Rails 4.2.1

从gettimeofday()开始, ruby MRI源会让我相信:

 int __cdecl gettimeofday(struct timeval *tv, struct timezone *tz) { FILETIME ft; GetSystemTimeAsFileTime(&ft); filetime_to_timeval(&ft, tv); return 0; } 

根据评论,这是一个C函数,由引擎盖下的ruby日期例程调用。 你不是自己调用这个方法,而是调用你正在调用的ruby方法。

你的问题涉及两件事。

第一个是ruby认为的时区。 这是您使用Time.nowTime.mktime 。 Ruby使用操作系统提供的C级API来获取此信息(TZ环境变量可以在unixy操作系统上覆盖它)。

第二个是用户在使用您的应用时会看到的时区。 这通常不是一回事。 即使您的用户都在同一时区,最好让您的服务器使用UTC,因为它不受夏令时之类的影响。

因此,rails有自己的时区系统,您找到的设置控制该时区的默认值。 有时您可能会在每个用户的基础上覆盖它。 Rails总是以UTC格式记录信息,但它将使用Time.zone的值显示在视图中(并且表单中的输入将在该区域中进行解释)。 您可以通过此操作查看此区域中的当前时间

 Time.zone.now