在 Rails 中,在特定时区创建特定时间(不是现在)的最佳方式是啥?

Posted

技术标签:

【中文标题】在 Rails 中,在特定时区创建特定时间(不是现在)的最佳方式是啥?【英文标题】: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 上提出这个问题的目的是为我的具体问题找到好的答案。否决投票是我表明我认为发布的答案不相关的方式。就是这样。 【参考方案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"。 投反对票,因为我现在不想要,我想要一个具体的时间,根据我的例子。

以上是关于在 Rails 中,在特定时区创建特定时间(不是现在)的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Rails:如何将日期时间字符串解析为特定时区

将时间戳转换为特定时区然后在 bigquery 中将其转换为日期时出现问题

如何在特定时区(最好是我的应用程序的默认时区,而不是 UTC)中创建新的 DateTime 对象?

如何检查.NET中特定时区是不是存在一个小时

如何检查特定属性是不是是有效的 ruby​​ on rails

创建具有特定时区的 NSDate 对象