如何从本地时区获取时间/日期字符串到UTC

时间:2011-12-06 02:21:37

标签: ruby-on-rails ruby

我有这个字符串: “2011-12-05 17:00:00”

这是当地时间

irb(main):034:0> Time.zone
=> (GMT-08:00) Pacific Time (US & Canada)

现在我如何以UTC格式获取Time对象?

这些不起作用:

Time.local("2011-12-05 17:00:00") => 2011-01-01 00:00:00 +0000
Time.local("2011-12-05 17:00:00").utc => 2011-01-01 00:00:00 UTC

更新

在我的本地计算机上,这有效:

Time.parse("2011-12-05 17:00:00").utc
 => 2011-12-06 01:00:00 UTC 

但是在heroku控制台上却没有:

Time.parse("2011-12-05 17:00:00").utc
=> 2011-12-05 17:00:00 UTC

3 个答案:

答案 0 :(得分:4)

您似乎应该使用Time.parse代替Time.local

require "time"
Time.parse("2011-12-05 17:00:00").utc

答案 1 :(得分:0)

在rails应用程序中尝试:

Time.zone = "Pacific Time"             # => "Pacific Time"
Time.zone.parse("2011-12-05 17:00:00") # => Mon, 05 Dec 2011 17:00:00 UTC +00:00

详情here

答案 2 :(得分:0)

我意识到我的问题有点复杂了。我想将时间存储在数据库中,没有时区,也没有时区转换。所以我离开了UTC的服务器和rails app时区。 但是当我把时间拉出来时,我有时需要将它们与用户所在的时区中的当前时间进行比较。所以我需要为用户获取Time.zone.now,但同样,我有时间.zone设置为UTC,因此不会发生自动转换。

我的解决方案是提取存储的用户时区并将其应用于Time.now以获取用户当地时间,如下所示:

class Business < ActiveRecord::Base
  def tz
    TZInfo::Timezone.get(ActiveSupport::TimeZone::MAPPING[self.time_zone])
  end

  def now
    tz.utc_to_local(Time.zone.now)
  end
end

所以我可以做类似的事情:

@client.appointments.confirmed_in_future(current_business.now)

-

def confirmed_in_future(date_start = Time.zone.now)
  confirmed.where("time >= ?", date_start)
end