Rails 的时区正确使用方法

如果你使用 Rails 开发应用,你一定遇到过时间显示不正确的问题,也就是时区问题。 下面我简单说明一下如何在 Rails 中正确使用时间、时区问题。

原理简介

Rails 已经为我们考虑到了时间问题。Rails 框架中存在两套时区的配置:

第一套是应用程序的时区

在 application.rb 文件中有一个时区的配置

1
2
    config.time_zone = 'Beijing'

这个配置文件是告诉 应用程序里面使用的时区是北京东八区(针对中国的应用就这样配置好了)。

第二套是数据库的存储的时区

同样在 application.rb 文件中

1
2
    config.active_record.default_timezone = :local

代表数据库中时区也用第一套, 一般情况下我们可以不做这个设置(即不添加这行到 application.rb 中)。 如果我们的应用是考虑到国际化的话也不应该指定这个配置。

这两套时区之间Rails为我们做了自动转换。

读取

rails 在将时间类型的数据存入数据库的时候会自动把时间转换成 UTC 时间, 表现的现象是: 你在表单里面填写的时间要比在数据库中直接看到的时间多8个小时。

存入

当我们的程序从数据库读取出时间字段的时候 Rails也会自动的将时区转换为应用程序的时区。

这个逻辑理解了之后,我们可以很容易控制时间的比对等问题了。

程序中时间使用的注意

再程序中正确的使用时间方法是:

1
2
3
4
5
  # 当前时间:
  Time.current
  # 而
  Time.now
  # 是使用的UTC时区
1
2
3
4
5
  # 创建带有当前时区的时间对象:
  Time.local(2014,1,11,08,30,20)
  # 而
  Time.new(2014,1,11,08,30,20)
  # 是没有时区的

如何强制的把程序中 Time.current 的时区从第一套转换为第二套呢? 方法也很简单:

1
  Time.current.to_s(:db)

当你想直接把时间带入sql语句比对时间的时候一定不要忘了做这个转换,否则您的时间比对就不正确了。

时区时间问题也就差不多了。了解了就不难。

Comments