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 時刻を表示したいのですが、これは変化する可能性があります。

入力from_dateには時間オフセットしかないため、in_time_zoneを使用できませんか?

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 に答える