【问题标题】:In Rails, what's the nicest way to create a specific time (not now) in a particular time zone?在 Rails 中,在特定时区创建特定时间(不是现在)的最佳方式是什么?
【发布时间】:2011-08-26 22:34:54
【问题描述】:

这是一种方法,但你能想出更好或更'railsy'的方法吗?

>> Time.use_zone('Sydney'){ Time.zone.parse('2011-04-12 2pm') }
=> Tue, 12 Apr 2011 14:00:00 EST +10:00

【问题讨论】:

  • 在您的原始问题中,您没有提到您现在不想要(即使您展示的示例使用的是特定时间),因此您不应该对答案投反对票..恕我直言!
  • @Zabba 最初的问题询问如何“创建特定时间”,再加上我的示例,这对我来说似乎很清楚,我对 Time.now 样式响应不感兴趣。为了更加清晰,我编辑了这个问题的标题,因为它显然不够清楚。尽管如此,在 Stack 上提出这个问题的目的是为我的具体问题找到好的答案。否决投票是我表明我认为发布的答案不相关的方式。就是这样。

标签: ruby-on-rails ruby-on-rails-3 time timezone


【解决方案1】:

我想你正在寻找

Time.find_zone('Alaska').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 AKST -09:00

Time.find_zone('Amsterdam').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 CET +01:00 

Time.find_zone('Sydney').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 EST +11:00  

Time.find_zone('Wellington').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 NZDT +13:00

这也适用于解析

Time.find_zone('Sydney').parse('2011-04-12 2pm')
=> Tue, 12 Apr 2011 14:00:00 EST +10:00 

【讨论】:

  • Time.find_zone('Alaska').local(2011,1,1) 在 IMO 中表现最好。看起来也不错,并且具有声明性。
【解决方案2】:

要解析特定时区内的日期,您可以使用 ActiveSupport::TimeZone

> ActiveSupport::TimeZone["Sydney"].parse("2011-04-12 2pm")
=> Tue, 12 Apr 2011 14:00:00 EST 10:00

TimeZone API 文档在这里: http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-c-5B-5D

【讨论】:

    【解决方案3】:

    这是我用的:

    Time.zone.local(2011, 4, 12, 14, 0)
    

    【讨论】:

    • 虽然,这不适用于特定区域。如果你能做到 Time.zone("Sydney").local(2011,4,12,14,0)
    • 我喜欢这个解决方案,因为您可以在Time.user_zone 中使用它。这样,我们可以在块内执行多​​项操作,同时在该特定时区创建新时间。
    【解决方案4】:

    如上所述,在特定时区创建时间(例如,2014 年 4 月 10 日下午 1:30 纽约):

    @event.start_time = Time.find_zone('Eastern Time (US & Canada)').local(2014,4,10,13,30)
    => Thu, 10 Apr 2014 13:30:00 EDT -04:00 
    
    @event.start_time.utc
    => 2014-04-10 17:30:00 UTC
    

    当它保存到您的数据库时,它将被转换为 UTC(至少在 Postgres 中,如果在您的迁移中使用时间戳类型),并且在将来访问时,它将相对于 config/application 中设置的应用程序时区显示.rb

    为了正确显示当地时间,我们还将时区名称(例如,“东部时间(美国和加拿大)”)存储在我们的数据库中。所以,当我们想在视图中打印时间时,我们会...

    @event.start_time.in_time_zone(@event.timezone)
     => Thu, 10 Apr 2014 13:30:00 EDT -04:00 
    

    获取缩写时区(例如,EST)

    @event.start_time.in_time_zone(@event.timezone).zone
    => "EDT" 
    

    【讨论】:

      【解决方案5】:

      如何使用 *in_time_zone* 帮助器..

      Time.now.in_time_zone('Sydney')
      

      【讨论】:

      • 如果您将其用作Time.parse('2011-04-12 2pm').in_time_zone('Sydney'),它实际上会在本地时区解析它,然后添加偏移量,使其成为“Wed, 13 Apr 2011 07:00:00 EST +10: 00"。
      • 投反对票,因为我现在不想要,我想要一个具体的时间,根据我的例子。
      猜你喜欢
      • 2013-02-14
      • 1970-01-01
      • 2016-11-23
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多