2011-10-26 12 views
17

私はDateTime.strptimeと解析する文字列を持っています。文字列内の日付のタイムゾーンはCETですが、RubyはUTC DateTimeオブジェクトを作成しますが、もちろんオフセットは2時間です。タイムゾーン付きストローム

現在、私はDateTime.strptime().change(:offset => "+0020")で問題を回避していますが、これは動作する方法ではないと確信しています。

誰かがこれを行う正しい方法で私を啓発することはできますか?

+0

CEST/CETタイムゾーンの国にいる場合、固定オフセットは機能しません。これにも興味がありますが、現在のタイムゾーンでstrptimeをどのように解析するのかはわかりません(ただし、現在の値ではなく、解析された文字列に応じて正しい値)。 – tokland

答えて

-1

私は@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

+0

この回答は正しくありません。 'parse()'は 'time_class'オプションをとりません。それは 'Chronic'クラスに直接設定されています。 –

+0

私の悪い...このオプションが利用できるようになるまで削除します=) – Abdo

+0

Erm ...受け入れられた回答を削除できません。私は上記のコメントをします。 – Abdo

9

私はそれを以下の方法を使用します。

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)> 

はあなたが何を意味するか、それか?

+2

私はパースされた文字列内のタイムゾーンを決定する文字列を持っていません。その10-26-2011 10:16:29の代わりに "10-26-2011 10:16:29 CET" – Nicolas

+0

あなたは私の問題を解決した、私はちょうど '09-19-2012 11:08:44" + " CST "。私はあなたが正しい答えだと思います。 – mwoods79

+0

夏時間に移行するとどうなりますか?これは "CST"にもっと情報を与えるべきではありませんか?上記のコメントによると、ちょうどフォーマットされた時間に基づいてそれを選ぶことができればいいと思う...私はタイムゾーンを嫌うことを学んでいる。 –

0

であるあなたが012とタイムゾーンする日付を変換することができます)に機能していないアプリケーションを介して他の部分を引き起こす可能性があります。たとえば:

Date.strptime('04/07/1988', '%m/%d/%Y').to_time_in_current_zone 
+3

http://apidock.com/rails/Date/to_time_in_current_zoneメソッドは無効です。 – Brandt

1

私はこの文字列を「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たものである

特にエレガントですが、機能します。

0

私はフォームから日付文字列を解析し、サーバー時間とは独立して保存しようとしているこの同じ問題と戦い続けています。私が従ったプロセスはそれ自体です。 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 

これを相殺しない日付文字列を占めることができ、解釈日付関数を持っていますもちろん、完璧なソリューションのように感じることはありませんが、それは動作します。正しいタイムゾーンを確保するために 手順は次のとおりです。

  1. は、日付はあなたがあれば(私たちは、これをしなければならないという時間帯での時間に基づいてオフセット現在のUTCを抽出し
  2. たちの書式に従って日付文字列をパースしますdstが東西時間ではdstではない間に構文解析が行われます。これはdstが解析された時間にローカルであることを保証します)
  3. 時間をGoogleのターゲットロケールに変換し、
1

少なくとも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 
3

これはRailsの5で動作します:

Time.zone.strptime("2017-05-20 18:20:10", "%Y-%m-%d %H:%M:%S") 

指定されたタイムゾーンの時刻を返します。

関連する問題