Ruby将UTC转换为用户的时区

时间:2013-10-02 01:04:52

标签: ruby

我以UTC格式保存dstring。虽然我有用户的时区偏移standard_offset 我希望在转换后在用户的时区显示该日期。这就是我的工作,但最后您可以看到它显示UTC而非PSTPDT

  [64] pry> dstring
  => "2013-10-31T23:10:50Z"
  [65] pry> standard_offset = -8
  => -8
  [66] pry> e = Time.parse(dstring) + (standard_offset * 3600)
  => 2013-10-31 15:10:50 UTC
  [67] pry> e.strftime("%m/%m/%Y %I:%M %p %Z")
  => "10/10/2013 03:10 PM UTC"

我希望最终获得10/10/2013 03:10 PM PST如何获得?注意:这不是rails应用程序。

3 个答案:

答案 0 :(得分:10)

我在in_timezone类中添加了方法Time方法,如下所示:

class Time
   require 'tzinfo'
   # tzstring e.g. 'America/Los_Angeles'
   def in_timezone tzstring
     tz = TZInfo::Timezone.get tzstring
     p = tz.period_for_utc self
     e = self + p.utc_offset
     "#{e.strftime("%m/%d/%Y %I:%M %p")} #{p.zone_identifier}"
   end
 end  

如何使用它:

t = Time.parse("2013-11-01T21:19:00Z")  
t.in_timezone 'America/Los_Angeles'

答案 1 :(得分:2)

显然这是Ruby标准库的一个问题。

来源:

http://rubydoc.info/gems/tzinfo/file/README.md

  

请注意,返回的本地时间将具有UTC时区(local.zone将返回“UTC”)。这是因为Ruby Time类仅支持两个时区:UTC和当前系统本地时区。

http://librelist.com/browser//usp.ruby/2011/9/24/unix-time-and-the-ruby-time-class/

  

现代内核不知道也不关心时区。来自的转换   UTC到本地时区(反之亦然)在用户空间[2]完成。   在同一台机器上同时运行的不同进程不会   必须共享相同的本地时区。

     

处理时区

     

“TZ”环境变量控制给定的时区   进程,以及附加到Ruby Time对象的时区。如果   “TZ”未设置,该过程的时区是实现定义的。

据我所知,Rails中与时区相关的所有内容都是由Rails核心团队构建的。 Ruby只处理与Unix提供的时间相关的功能,并且可能希望用户处理重置。

答案 2 :(得分:-2)

require 'tzinfo'
class Time
   def in_timezone(tzstring)
     tz = TZInfo::Timezone.get(tzstring)
     p = tz.period_for_utc(self.utc)
     # puts "#{tzstring} -> utc_offset=#{p.utc_offset},utc_total_offset=#{p.utc_total_offset},p.offset=#{p.offset}"
     e = self.utc + p.utc_total_offset
     "#{e.strftime('%Y-%d-%m %H:%M:%S')} #{p.zone_identifier}"
   end
end

[Time.parse("2013-10-20T21:19:00Z"), Time.parse("2013-11-20T21:19:00Z")].each do |t|
    puts '=======================================================> ' + t.to_s
    puts "\t" + t.in_timezone('GMT')
    puts "\t" + "------------------"
    puts "\t" + t.in_timezone('Europe/London')
    puts "\t" + t.in_timezone('Europe/Prague')
    puts "\t" + t.in_timezone('Asia/Jerusalem')
end