4

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 应用程序。

4

3 回答 3

10

in_timezoneTime类中添加了一个方法方法如下:

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'
于 2013-10-02T21:46:29.300 回答
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 提供的与时间相关的功能,并且可能希望用户处理重置。

于 2013-10-02T01:18:30.037 回答
-2
需要'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")].each 做 |t|
    放'================================================= =======> ' + t.to_s
    放 "\t" + t.in_timezone('GMT')
    放 "\t" + "------"
    puts "\t" + t.in_timezone('Europe/London')
    puts "\t" + t.in_timezone('Europe/Prague')
    puts "\t" + t.in_timezone('Asia/Jerusalem')
结尾
于 2013-11-05T00:30:47.043 回答