如何从Rails的现有Time.zone创建Ruby DateTime?

at.*_*at. 25 ruby timezone datetime ruby-on-rails ruby-on-rails-3.2

我让用户在Ruby on Rails网站上输入日期.我将日期解析为DateTime对象,例如:

date = DateTime.new(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i)
Run Code Online (Sandbox Code Playgroud)

要么

date = DateTime.parse(params[:date])
Run Code Online (Sandbox Code Playgroud)

两个DateTimes都不会出现在我之前设置的用户的时区中,例如:

Time.zone = "Pacific Time (US & Canada)"
Run Code Online (Sandbox Code Playgroud)

如何解析上面的DateTimes以使其处于正确的时区?我知道该DateTime.new方法的时间偏移量为第7个参数.是否有一种简单的方法可以在给定时间内查找时区的偏移量?或者我应该使用其他东西DateTime

shw*_*eta 32

尝试:

Time.zone = "Pacific Time (US & Canada)"
Time.zone.parse('8-11-2013 23:59:59') #=> Fri, 08 Nov 2013 23:59:59 PST -08:00 
Run Code Online (Sandbox Code Playgroud)

要么

Time.now.in_time_zone("Pacific Time (US & Canada)")
Run Code Online (Sandbox Code Playgroud)

要么

DateTime.now.in_time_zone("Pacific Time (US & Canada)")
Run Code Online (Sandbox Code Playgroud)

  • 为了补充这里的答案,我将在常量中找到所有可用区域的列表 https://apidock.com/rails/TimeZone (2认同)

小智 22

Time.zone.local如果您Time.zone之前设置,则可以使用:

user_time = Time.zone.local(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i, 0)
Run Code Online (Sandbox Code Playgroud)

看看ActiveSupport::TimeWithZone文档.

  • 对于拥有Railscasts.com专业版帐户的任何人:http://railscasts.com/episodes/106-time-zones-revised (2认同)

小智 16

您可以使用以下代码创建DateTime所需的对象TimeZone.

DateTime.new(2013, 6, 29, 10, 15, 30).change(:offset => "+0530")
Run Code Online (Sandbox Code Playgroud)

更新:使用新的 1.9.1版本的Rails Ruby,下面的代码就像魔术一样完成同样的工作.

DateTime.new(2013, 6, 29, 10, 15, 30, "+0530")
Run Code Online (Sandbox Code Playgroud)

文档在这里

  • 而且你已经有一个设定时区的时间你可以做DateTime.new(2013,6,29,10,15,30).change(:offset => known_time.zone) (2认同)

twn*_*ing 7

DateTime.new从 ruby​​ 1.9.1 开始接受可选的偏移量参数(作为第七个)

我们可以写

DateTime.new(2018, 1, 1, 0, 0, 0, Time.zone.formatted_offset)
Run Code Online (Sandbox Code Playgroud)