Ruby on rails 在Rails中操作时区

Ruby on rails 在Rails中操作时区,ruby-on-rails,datetime,Ruby On Rails,Datetime,我有一个rails应用程序,它需要在其中一个表单中捕获时间日期和时区,例如: 时区:“香港”作为字符串 日期时间:“31/12/2013 23:59”作为字符串 应用程序的默认时区设置为“墨尔本”,应用程序当前接受日期时间,并自动转换为“2013-12-31 23:59:00+1100”,即+1100是墨尔本时区与夏令时的偏移量 我希望应用程序: 1选择“31/12/2013 23∶5900”作为选定时区的时间,即香港。 2将香港时间转换为墨尔本时间,即“31/12/2013 23:5900 +

我有一个rails应用程序,它需要在其中一个表单中捕获时间日期和时区,例如: 时区:“香港”作为字符串 日期时间:“31/12/2013 23:59”作为字符串

应用程序的默认时区设置为“墨尔本”,应用程序当前接受日期时间,并自动转换为“2013-12-31 23:59:00+1100”,即+1100是墨尔本时区与夏令时的偏移量

我希望应用程序: 1选择“31/12/2013 23∶5900”作为选定时区的时间,即香港。 2将香港时间转换为墨尔本时间,即“31/12/2013 23:5900 + 0800”到“01 / 01 / 2014 0:595+1100”,并持续到数据库中。 3在2的转换过程中,需要注意夏令时

我已经编写了下面的代码,它只在控制器中工作。但是,当我使用“创建前过滤器”将其移动到模型时,它不起作用

time_zone = ActiveSupport::TimeZone.new(params[:time_zone])
date_time = DateTime.strptime(params[:date_time], '%d/%m/%Y %H:%M')

new_date_time = date_time.change(offset: time_zone.formatted_offset(false))
melbourne_date_time = new_date_time.in_time_zone(Time.zone)
它在模型中不起作用的原因是,在控制器中,我手动将日期时间字符串解析为日期时间对象。但在模型中,rails会自动将日期时间字符串转换为TimeWithZone对象。。。因此,不能真正改变对象

我已经在谷歌上搜索了一段时间,但仍然无法找到确切的解决方案

任何帮助都将不胜感激

另外,应用程序在Rails 3.2.12上。我计划在一个模型的before_create过滤器附带的方法中运行转换


干杯

您只需为rails应用程序设置默认时区即可

打开config/application.rb

使用此选项设置默认时区

class Application < Rails::Application

  config.time_zone = 'Hong Kong'
  config.active_record.default_timezone = 'Hong Kong'

end

我找到了一个脏的?在模型中归档所需内容的方法

来自表单的用户输入: 时区-“香港”作为字符串, 日期时间—“31/12/2013 23:59:00”作为字符串

config.time_zone = 'Melbourne'# in config/application.rb

self.time_zone # 'Hong Kong' as String
self.date_time # '31/12/2013 23:59:00 +1100' as TimeWithZone

class MyClass < ActiveRecord::Base
  before_create :populate_date_time_with_zone
  def populate_date_time_with_zone
    original_tz = Time.zone # Capture the system default timezone, 'Melbourne'
    Time.zone = self.time_zone # Change the timezone setting for this thread to 'Hong Kong'
    dt = Time.zone.parse(self.date_time.strftime('%d/%m/%Y %I:%M%p')) #Dirty??
    self.date_time = dt.in_time_zone(original_tz) # '01/01/2014 02:59:00 +1100' as TimeWith Zone
  end
end

有没有比将日期时间打印成字符串更好的方法,而不是用修改过的时区再次解析它?

Hi Gopal,正如我在问题中所述,应用程序的默认时区是config/application.rb中的“Melbourne”config.time\u zone=“Melbourne”。用户可以选择在“TimeTyZON-SOLECT”上为我的问题(如香港、阿德莱德等)提供的任何时区。我很高兴将“墨尔本”作为我的默认时区。你的模型是什么样子的?当你使用它时会发生什么?您将无法直接从模型访问控制器的参数。Ari,我知道我将无法从模型访问参数。上面的代码是我在控制器中使用的spike解决方案的直接副本。在模型中,时区和日期时间是我的模型的属性,我不必从参数中检索它。我遇到的问题是操纵TimeWithZone对象。我需要强制TimwWithZone date\u time的时区为用户选择的时区,然后使用in\U time\u time zone方法转换为墨尔本时间。