在我的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)
答案 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:00
与2015-08-25 00:05:00 UTC
UTC表示时区+00:00
答案 2 :(得分:0)
实现这一目标的更短途径:
config.time_zone
文件中设置application.rb
。Time.zone.now
保存记录。 示例:强>
在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
希望这有帮助:)