我们有一些Ruby(在Rails上下文中),它将表示的时间整数解析为日期时间,我们需要确保日期时间被解析为太平洋时间:

DateTime.new(2012, 11, 17, 3, 2, 0, 'PST')

然而,我们需要将其更改为PDT~半年.我们如何在运行时判断我们应该通过PST还是PDT?

推荐答案

你不应该试图自己决定是否通过PST或PDT(或它们的等值补偿).相反,请使用时区标识符,例如从the IANA tz database开始的时区标识符(例如,美国太平洋时间为America/Los_Angeles),并允许该区域的基础数据确定给定日期和时间的适当偏移量.

在Ruby中,有几种不同的方法可以实现这一点.

  • 您可以使用TZInfo库:

    require 'tzinfo'
    
    tz = TZInfo::Timezone.get('America/Los_Angeles')
    dt = tz.local_datetime(2012, 11, 17, 3, 2, 0)
    

    我相信这个库已经包含在Rails中了.

  • 您可以使用timezone库(尽管我不确定它与tzinfo到底有什么不同)

    require 'timezone'
    
    tz = Timezone['America/Los_Angeles']
    dt = tz.time_with_offset(Time.new(2012, 11, 17, 3, 2, 0))
    
  • 特别是在Rails中,您can使用了ActiveSupport::TimeZone类,尽管我不推荐这样做.

    tz = ActiveSupport::TimeZone['Pacific Time (US & Canada)']
    dt = tz.local(2012, 11, 17, 3, 2, 0)
    

    不推荐这种方法的原因在timezone tag wiki中描述,在最下面标题为"Rails时区标识符"的一节中.遗憾的是,如果您的应用程序需要它们--它们仍然存在于Rails中.

Ruby-on-rails相关问答推荐

HTTP:MimeNegotiation::InvalidType(html不是有效的MIME类型):""

方法和括号之间没有空格时出错

Rails 7.1,登录到STDOUT和LOG/Production.log

如何在不触发每次编译的情况下运行`bin/rails测试`?

如何将实例变量传递给 RSpec 共享示例

如何在 Linux 上使用 Ruby 2.0 改进独角兽进程之间的内存共享

如何在 routes.rb 中使用 301 或 302 进行重定向

可能在rails中有多态has_one关系?

如何在不删除项目本身的情况下删除单个 HABTM 关联项目?

Rails 3. 构建 oauth2 提供程序

通过重定向使闪存哈希保持不变

在本地 Rails 开发环境中获取真实 IP 地址

遇到在早期版本的 Rails 中使用 attr_accessible 的情况时,Rails 4 中的禁止属性错误

设计记住我和会话

在 Rails 生产中禁用assets资源 缩小

减go Ruby 中的日期并以分钟为单位得到差异

如何测试自定义验证器?

在 Rails 路由中更改 id 参数

以最Ruby 风格计算 ActiveSupport:TimeWithZone 天数的差异?

Ruby/Rails CSV 解析,UTF-8 中的无效字节序列