Ruby将UTC转换为用户的时区

我有dstring保存在UTC中。 虽然我有用户的时区偏移量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应用程序。

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

 class Time require 'tzinfo' # tzstring eg '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' 

显然这是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提供的时间相关的function,并且可能希望用户处理重置。

要求'tzinfo'
上课时间
    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}”
   结束
结束

 [Time.parse(“2013-10-20T21:19:00Z”),Time.parse(“2013-11-20T21:19:00Z”)]。每个都做| t |
    把'================================================ =======>'+ t.to_s
    把“\ t”+ t.in_timezone('GMT')
    把“\ t”+“------------------”
    放“\ t”+ t.in_timezone('Europe / London')
    放“\ t”+ t.in_timezone('Europe / Prague')
    放“\ t”+ t.in_timezone('亚洲/耶路撒冷')
结束