4

私のアプリは「モスクワ」(+04:00) タイムゾーンで動作しています。ただし、ローカル時間 (たとえば、「01 may 2012 13:45」) と ActiveSupport::TimeZone オブジェクトの名前 (たとえば、「Berlin」: 夏時間の +02:00 と +01:それ以外の場合は 00)。

たとえば、入力として "01 may 2012 13:45" と "Berlin" を取得した場合、"2012-05-01 13:45:00 +0200" または "2012-05-01 11:45:00 + 0000」。次の関数を作成します。

def from_local_datetime(local_datetime, time_zone)
  offset = Time.now.in_time_zone(time_zone).formatted_offset
  datetime = case local_datetime
  when String
    DateTime.parse(local_datetime)
  else
    DateTime.new(local_datetime)
  end.change(:offset => offset)

  return datetime
end

そして、一見すると、期待どおりに機能します。しかし、この種のタスクのベスト プラクティスはありますか? 状況によってはエラーが発生する可能性があります。よくわかりません。

どんなコメントでも大歓迎です。

UPD: DST が時間を変更する時間についてバグが発生する可能性があると思います。たとえば、2011 年 3 月 26 日はベルリンのタイム ゾーンでは GMT+1 で、Time.now.in_time_zone("Berlin").formatted_offset"GMT+1" を返しますが、2011 年 3 月 27 日では GMT+2 にfrom_local_datetime("28 march 2011", "Berlin")なります28 march 2011 00:00:00 +0100。私の関数が返す時間28 march 2011 00:00:00 +0200:(

4

2 に答える 2

0

あなたの変換方法は正しいアプローチです。

Web サイトでは、時刻が UTC としてデータベースに保存されていることを確認する必要があります。現地時間の代わりにデータベースから UTC 値を取得できる場合 (または Web サーバーのタイムゾーンを UTC に設定できる場合)、UTC から現地時間に時刻を変換する必要はありません。とにかくユーザーのタイムゾーンに変換します。

そしてもちろん、ユーザーのタイム ゾーン設定を保存する必要があります。

于 2012-05-04T11:13:10.617 に答える