で解析する文字列がありDateTime.strptime
ます。文字列の日付のタイムゾーンは CET ですが、Ruby はもちろん 2 時間のオフセットを持つ UTC DateTime オブジェクトを作成します。
現在、私はこの問題を回避していますDateTime.strptime().change(:offset => "+0020")
が、これは本来の動作方法ではないと確信しています。
誰かがこれを行う正しい方法について教えてもらえますか?
で解析する文字列がありDateTime.strptime
ます。文字列の日付のタイムゾーンは CET ですが、Ruby はもちろん 2 時間のオフセットを持つ UTC DateTime オブジェクトを作成します。
現在、私はこの問題を回避していますDateTime.strptime().change(:offset => "+0020")
が、これは本来の動作方法ではないと確信しています。
誰かがこれを行う正しい方法について教えてもらえますか?
私は次のように使用します。
ruby-1.9.2-head :001 > require 'date'
=> true
ruby-1.9.2-head :002 > fmt = "%m-%d-%Y %H:%M:%S %Z"
=> "%m-%d-%Y %H:%M:%S %Z"
ruby-1.9.2-head :003 > DateTime.strptime "10-26-2011 10:16:29 CET", fmt
=> #<DateTime: 2011-10-26T10:16:29+01:00 (212186380589/86400,1/24,2299161)>
ruby-1.9.2-head :004 > DateTime.strptime "10-26-2011 10:16:29 UTC", fmt
=> #<DateTime: 2011-10-26T10:16:29+00:00 (212186384189/86400,0/1,2299161)>
ruby-1.9.2-head :005 > DateTime.strptime "10-26-2011 10:16:29 PST", fmt
=> #<DateTime: 2011-10-26T10:16:29-08:00 (212186412989/86400,-1/3,2299161)>
それはあなたが意味するものですか?
Time#strptime
少なくとも Rails 4.2 以降 (おそらくそれ以前、テストしていない)の代わりにを使用している限りDateTime.strptime
、現在のタイム ゾーンが自動的に適用されます。
> DateTime.strptime('12/28/2016 5:00 PM', '%m/%d/%Y %H:%M %p')
=> Wed, 28 Dec 2016 17:00:00 +0000
> Time.strptime('12/28/2016 5:00 PM', '%m/%d/%Y %H:%M %p')
=> 2016-12-28 17:00:00 -0800
私はこの文字列を「strptiming」していました:
19/05/2014 8:13:26 a.m.
ローカル タイムスタンプ。私の場合はオークランド NZ で、文字列にタイムゾーン スタンプが含まれていません。
私が知るTime.strptime
限り、サーバーのタイムゾーンをベースとして使用しています。
私の状況と一般的なグッド プラクティスでは、私のサーバーは UTC タイムゾーンで実行されているため、文字列のすべての解析で時間オブジェクトが作成され、+0000 (UTC) までの時間が作成されます。
2014-05-19 08:13:26 +0000
次に、次のように変換しin_time_zone(Time.zone)
ます。
Mon, 19 May 2014 20:13:26 NZST +12:00
ご覧のとおり、実際の時間よりも 12 時間 (UTC オフセット) 遅れています。
+' Auckland', '...%Z'
上記のトリックを変更せずに使用しようとしました。次に、+ '+1200', '...%Z'
正しく機能する上記のトリックを使用しました。
しかし、私は夏の時間を心配していたので、解析は1時間遅れていたので、これが私が仕上げたものです:
Time.strptime(call_data[:datetime].gsub(/\./, "").gsub(/am/, "AM").gsub(/pm/, "PM") + (Time.zone.now.time_zone.utc_offset/3600).to_s.ljust(4,'0').rjust(6,' +'), '%d/%m/%Y %I:%M:%S %p %Z').in_time_zone(Time.zone)
結果:
Mon, 19 May 2014 08:13:26 NZST +12:00
特にエレガントではありませんが、機能します。
で日付をタイムゾーンに変換できますto_time_in_current_zone
。例えば:
Date.strptime('04/07/1988', '%m/%d/%Y').to_time_in_current_zone
承認済みの回答を削除できません
以下のコメント セクションで @LeeJarvis が指摘したように、オプションChronic.parse
は受け入れられません。:time_class
したがって、この回答はバグが多く、機能しているように見えますが、機能していません (Chronic が:time_class
すぐにオプションを渡すことを許可しない限り)。
Chronic gemは本当に強力です。
私はこのように使用します:
Chronic.parse("next 5:00 pm",
:time_class => ActiveSupport::TimeZone.new(User.first.time_zone)).utc
上記の例でUser.first.time_zone
は、「太平洋時間 (米国およびカナダ)」です。
Chronic は多くのフォーマットをサポートしているので、 https://github.com/mojombo/chronicで確認してください。
オプションを渡して:time_class
UTC に変換するようにしてください (ドキュメントでは、Chronic は:time_class
parse を呼び出す前に設定します。アプリケーション全体の他の部分が機能しなくなる可能性があるため、このアプローチは避けています)。
TimeZone のドキュメントは http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.htmlにあります。