私はDateTime.strptime
と解析する文字列を持っています。文字列内の日付のタイムゾーンはCETですが、RubyはUTC DateTimeオブジェクトを作成しますが、もちろんオフセットは2時間です。タイムゾーン付きストローム
現在、私はDateTime.strptime().change(:offset => "+0020")
で問題を回避していますが、これは動作する方法ではないと確信しています。
誰かがこれを行う正しい方法で私を啓発することはできますか?
私はDateTime.strptime
と解析する文字列を持っています。文字列内の日付のタイムゾーンはCETですが、RubyはUTC DateTimeオブジェクトを作成しますが、もちろんオフセットは2時間です。タイムゾーン付きストローム
現在、私はDateTime.strptime().change(:offset => "+0020")
で問題を回避していますが、これは動作する方法ではないと確信しています。
誰かがこれを行う正しい方法で私を啓発することはできますか?
私は@LeeJarvisは以下のコメントセクションで指摘したように、Chronic.parse
は:time_class
オプションを受け入れていない受け入れ答え
を削除することはできません。だから、この答えはバギーであり、それが作品のように見えるが、それはしていません(慢性すぐに:time_class
オプションを渡すことができます場合は除きます。)
慢性宝石は本当に強力です。
私はこのようにそれを使用する:上記の私の例では
Chronic.parse("next 5:00 pm",
:time_class => ActiveSupport::TimeZone.new(User.first.time_zone)).utc
、User.first.time_zone
は "太平洋標準時(米国&カナダ)" です。
慢性慢性セット:time_class
解析を呼び出す前に、そう:time_class
オプションを渡すことを確認し、ドキュメントに(UTCに変換し https://github.com/mojombo/chronic
でそれをチェックアウト形式の多くをサポートしています。私は、このアプローチ理由を避けますそれは
タイムゾーンのマニュアルが http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
私はそれを以下の方法を使用します。
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)>
はあなたが何を意味するか、それか?
私はパースされた文字列内のタイムゾーンを決定する文字列を持っていません。その10-26-2011 10:16:29の代わりに "10-26-2011 10:16:29 CET" – Nicolas
あなたは私の問題を解決した、私はちょうど '09-19-2012 11:08:44" + " CST "。私はあなたが正しい答えだと思います。 – mwoods79
夏時間に移行するとどうなりますか?これは "CST"にもっと情報を与えるべきではありませんか?上記のコメントによると、ちょうどフォーマットされた時間に基づいてそれを選ぶことができればいいと思う...私はタイムゾーンを嫌うことを学んでいる。 –
であるあなたが012とタイムゾーンする日付を変換することができます)に機能していないアプリケーションを介して他の部分を引き起こす可能性があります。たとえば:
Date.strptime('04/07/1988', '%m/%d/%Y').to_time_in_current_zone
http://apidock.com/rails/Date/to_time_in_current_zoneメソッドは無効です。 – Brandt
私はこの文字列を「strptiming」した
19/05/2014 8:13:26 a.m.
私の場合、ローカルタイムスタンプは、見ることができるように、文字列にタイムゾーンスタンプなしオークランドNZです。
Time.strptime
は、サーバーのタイムゾーンをベースとして使用することをお勧めします。私の状況で
、および一般的な良い習慣、私のサーバーは、0000(UTC)までの時間、その文字列のすべての解析は、時間オブジェクトを作成することになったUTCタイムゾーンで実行します。次に
2014-05-19 08:13:26 +0000
変換に与えた:見ることができるように
Mon, 19 May 2014 20:13:26 NZST +12:00
は私が望んでいた実際の時間よりも遅い(UTCオフセット)12時間です。
上記のように+' Auckland', '...%Z'
トリックをそのまま使用しようとしましたが、変更はありません。 それから、上記の通りに正しく動作した+ '+1200', '...%Z'
のトリックを使用しました。それはありません
Mon, 19 May 2014 08:13:26 NZST +12:00
:
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)
結果:しかし、私は、その後の解析は、時間によってなり、夏の時間を心配していたので、これは私がfinshedたものである
特にエレガントですが、機能します。
私はフォームから日付文字列を解析し、サーバー時間とは独立して保存しようとしているこの同じ問題と戦い続けています。私が従ったプロセスはそれ自体です。 RoRとRubyのタイムゾーンがUTCに設定されていることを確認します。サーバーがUTC時刻にある場合は、それがより簡単になります。私は、ユーザーを格納しています
はactivesupportのを使用してロケール:US/Eastern
のようなタイムゾーンのフォーマットを私はネイティブにタイムゾーンが含まれているか
# date_str looks something like this `12/31/2014 6:22 PM`
# tz is a string containing an ActiveSupport::TimeZone name like `US/Eastern`
def interpret_date(date_str, tz)
Time.use_zone tz do
parsed_dt = DateTime.strptime(date_str, '%m/%d/%Y %H:%M %p')
offset = parsed_dt.in_time_zone(tz).utc_offset
parsed_dt.advance(seconds: -(offset)).in_time_zone(tz)
end
end
これを相殺しない日付文字列を占めることができ、解釈日付関数を持っていますもちろん、完璧なソリューションのように感じることはありませんが、それは動作します。正しいタイムゾーンを確保するために 手順は次のとおりです。
少なくともRailsの4.2のS(多分以前、テストしていない)限り、あなたはTime#strptime
代わりの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
これはRailsの5で動作します:
Time.zone.strptime("2017-05-20 18:20:10", "%Y-%m-%d %H:%M:%S")
指定されたタイムゾーンの時刻を返します。
CEST/CETタイムゾーンの国にいる場合、固定オフセットは機能しません。これにも興味がありますが、現在のタイムゾーンでstrptimeをどのように解析するのかはわかりません(ただし、現在の値ではなく、解析された文字列に応じて正しい値)。 – tokland