1

さまざまなユーザーが地球のさまざまな場所にいるアプリがあり (タイムゾーンを知っています)、日付と時刻を入力でき、すべてを UTC で DB に保存する必要があります。

通常、Time 変数をインスタンス化するために、次のことを行っています。

DateTime.new(date.year, date.month, date.day, hours, minutes, 0)

これはすでに UTC ですが、変換はされていません。

その文字列に time_zone (つまり、「Melbourne」) を含む 7 番目のパラメーターを追加すると、オーストラリアの日付として解釈され、UTC に変換された結果の DateTime は 10 時間遅れます。動作します。

ただし、夏時間は考慮されていません。

私が必要とするのは、正確にそれを行うことです (たとえば、日付/時刻のコンポーネントからの DateTime)。(たとえば、オーストラリアの場合)、4 月 9 日に同じ時間/分を使用すると、別のオフセットが得られます。 4 月 5 日を使用した場合よりも UTC に変換した場合。

何か案は?

ありがとう!
ダニエル

4

1 に答える 1

3

見てtzinfo

irb(main):002:0> require 'tzinfo'
=> true
irb(main):003:0> tz = TZInfo::Timezone.get("Australia/Melbourne")
=> #<TZInfo::DataTimezone: Australia/Melbourne>

irb(main):004:0> tz.utc_to_local(Time.parse("2013-04-05 00:00:00"))
=> Fri Apr 05 11:00:00 UTC 2013
irb(main):005:0> tz.utc_to_local(Time.parse("2013-04-09 00:00:00"))
=> Tue Apr 09 10:00:00 UTC 2013

irb(main):015:0> tz.local_to_utc(Time.parse("2013-04-09 00:00:00"))
=> Mon Apr 08 14:00:00 UTC 2013
irb(main):016:0> tz.local_to_utc(Time.parse("2013-04-05 00:00:00"))
=> Thu Apr 04 13:00:00 UTC 2013
于 2013-05-24T16:23:32.303 に答える