1

用户输入一个日期范围,比如说从昨天开始的任何时区。

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

有什么办法吗?

4

1 回答 1

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. 从偏移量到名称的映射不是唯一的。
  2. ActiveSupport::TimeZone[]如果给你的名字错误,DST 可能是个问题。

根据您的需要,您可以手动应用偏移量并在格式化时间戳时忽略时区:

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