Rails如何知道我的时区?

时间:2015-06-13 03:45:29

标签: ruby-on-rails ruby

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

2 个答案:

答案 0 :(得分:2)

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

int __cdecl
gettimeofday(struct timeval *tv, struct timezone *tz)
{
     FILETIME ft;

     GetSystemTimeAsFileTime(&ft);
     filetime_to_timeval(&ft, tv);

     return 0;
}

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

答案 1 :(得分:2)

你的问题涉及两件事。

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

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

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

查看此区域中的当前时间
Time.zone.now