在我的rails应用程序中,我获取数据并按其日期保存所有具有今天日期的记录,以便稍后调用。
问题是数据以这种格式出现"8:05 PM ET"
当我解析它以获得日期格式时,我得到这个:
"Mon, 24 Aug 2015 20:05:00 EDT -04:00"
,这是正确的日期。问题是,当我把它保存在数据库中时它被保存为
"2015-08-25 00:05:00 UTC"
当我请求数据库给我今天的所有数据时,它不会检索这条记录,因为日期显示记录是25"明天"**而不是**24"今天"。
如何在数据库中保存该记录为今天"24"而不是as明天"25" ?
我配置:应用程序。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)
在您的数据库中,日期保存在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
。
更多选项参见配置活动记录。
因此,您可以使用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')
您可能需要考虑更多地研究一下时区。
在您的情况下,Mon, 24 Aug 2015 20:05:00 EDT -04:00
是与2015-08-25 00:05:00 UTC
相同的日期
UTC表示时区+00:00
更简短的方法:
- 在
application.rb
文件中设置config.time_zone
。 - 使用
Time.zone.now
保存您的记录
例子:
在Rails应用程序中设置'Buenos Aires'时区。rb文件。
# 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
希望有帮助