在请求的TimeZone中返回Ruby / Rails DateTime或ActiveSupport :: TimeWithZone对象

时间:2012-10-18 06:15:18

标签: ruby-on-rails ruby datetime timezone

用户从昨天开始输入一个日期范围,包括任何时区。

from_datetime = "10/01/2012 00:00 +0545"

我为这本书购买时间如下:

purchased_at = Book.where("created_at > #{from_date}").purchased_at
=> Fri, 08 Jun 2012 09:44:26 UTC +00:00

问题是这给了我UTC时间但是我想在所请求的time_zone中显示purchase_at时间,这可能会有所不同。

我不能使用in_time_zone作为输入from_date只有时间偏移,可以吗?

purchased_at.in_time_zone("Kathmandu")
=> Fri, 08 Jun 2012 15:29:26 NPT +05:45

有什么办法吗?

1 个答案:

答案 0 :(得分:2)

提供偏移量,您可以从ActiveSupport::TimeZone获取时区名称:

> ActiveSupport::TimeZone[5.hours + 45.minutes]
=> (GMT+05:45) Kathmandu

然后你可以把它交给in_time_zone

> Time.now.in_time_zone(ActiveSupport::TimeZone[5.hours + 45.minutes])
=> Thu, 18 Oct 2012 12:33:12 NPT +05:45 

如果您知道传入的格式,可以通过一些简单的争论来拉出from_datetime的偏移量。

这种方法存在问题:

  1. 从offset到name的映射不是唯一的。
  2. 如果ActiveSupport::TimeZone[]给你错误的姓名,DST可能会出现问题。
  3. 根据您的需要,您可以手动应用偏移量,并在格式化时间戳时忽略时区:

    > (Time.now.utc + 5.hours + 45.minutes).strftime('%Y-%m-%d %H:%M:%S +0545')
    => "2012-10-18 12:40:12 +0545"