【问题标题】:Ruby converting UTC to user's time zoneRuby 将 UTC 转换为用户的时区
【发布时间】:2013-10-02 01:04:51
【问题描述】:

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

【问题讨论】:

标签: ruby


【解决方案1】:

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

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'

【讨论】:

  • 你们这些美国人和你们倒转的月/日日期! ^^ 没有办法从时区获取时间格式吗?
  • 自 Rails 3 以来实际上有一个 ActiveSupport 内置方法:apidock.com/rails/v3.0.0/DateTime/in_time_zone
  • 这几乎对我有用。我不得不使用p.utc_total_offset 来说明夏令时。 utc_offset 返回非 DST 的偏移量。
【解决方案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 提供的与时间相关的功能,并且可能希望用户处理重置。

【讨论】:

    【解决方案3】:
    需要'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') 结尾

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 2011-05-19
      • 2020-03-21
      • 2021-01-04
      • 2021-08-01
      • 2021-09-07
      相关资源
      最近更新 更多