如何正确设置我的时区以正确保存记录?

时间:2015-08-24 15:21:09

标签: ruby-on-rails ruby datetime ruby-on-rails-4 timezone

在我的rails应用程序中,我正在获取数据并将其保存在所有具有今天日期以便稍后调用的记录的日期之前。

问题是数据的格式为“美国东部时间下午8:05”

当我解析它以日期格式得到它时,我得到了这个:

"Mon, 24 Aug 2015 20:05:00 EDT -04:00"

,这是正确的日期。问题是当我将其保存在数据库中时保存为

"2015-08-25 00:05:00 UTC"

当我向db请求给我今天的所有数据时,它不会检索此记录,因为日期表明记录是明天25“**而不是**”今天“。

如何将该记录保存在我的数据库中 今天“24”而不是 明天“25”

我的配置:

application.rb

class Application < Rails::Application
    Dir["#{Rails.root}/lib/**/**/*.rb"].each { |f| require f }
    config.time_zone = 'Eastern Time (US & Canada)'.freeze
    config.active_record.default_timezone = :local
    config.active_record.raise_in_transactional_callbacks = true
end

之前保存:

string = '7:05 PM ET'
datetime = DateTime.now
Time.use_zone('Eastern Time (US & Canada)') do
      datetime = Time.zone.parse(string)
 end
baz.create(time: datetime, foo: 'bar')

当我尝试访问它时

baz.where(time:Date.today.to_time.beginning_of_day..Date.today.to_time.end_of_day)

3 个答案:

答案 0 :(得分:1)

在您的数据库中,日期保存在UTC

但是,如果您想以自己的时区格式检索日期,可以在config/application.rb文件中指定您的时区:

config.time_zone = 'Eastern Time (US & Canada)'.freeze

然后,你可以这样做:

time_now =  DateTime.now
time_now_in_my_zone = time_now.in_time_zone(Rails.application.config.time_zone).to_datetime

请参阅ActiveSupport::TimeWithZone

为了保持一致性并节省本地时区到数据库的时间,必须在application.rb

中设置
 config.active_record.default_timezone = :local

默认时区为:utc

有关更多选项,请参阅Configuring Active Record

因此,您可以使用config.active_record.default_timezone = :local设置以本地格式保存日期,并以您的格式检索日期,并保持一致。我想,这回答了你的问题。如果没有,请告诉我!

更新

变化:

Time.use_zone('Eastern Time (US & Canada)') do
      datetime = Time.zone.parse(string)
 end

为:

datetime = Time.now.in_time_zone(Rails.application.config.time_zone).to_datetime
    baz.create(time: datetime, foo: 'bar')

答案 1 :(得分:0)

您可能需要考虑更多地了解time zones

在您的情况下Mon, 24 Aug 2015 20:05:00 EDT -04:002015-08-25 00:05:00 UTC

的日期相同

UTC表示时区+00:00

答案 2 :(得分:0)

实现这一目标的更短途径:

  1. config.time_zone文件中设置application.rb
  2. 使用Time.zone.now保存记录。
  3. 示例:
    在Rails application.rb文件中设置'Buenos Aires'时区。

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    config.time_zone = 'Buenos Aires'
    

    然后你可以使用它来存储正确的时间:
    Time.zone.now # => Mon, 24 Aug 2015 13:06:21 ART -03:00

    如果您想知道自己需要什么 time_zone ,可以运行:rake time:zones:all

    希望这有帮助:)