2012-04-11 10 views
4

私は文字列の解析に取り組んでおり、私に問題を引き起こしているテストケースがあります。 strptimeで日付/時刻文字列を解析すると、夏時間は考慮されません。これは私が知る限り、バグです。私はこのバグの文書を見つけることができません。以下は、Railsコンソールのテストケースです。これはruby 1.9.3-p215とRails 3.2.2です。あなたが見ることができるようにRails夏時間がDateTime.strptimeを使用していると考慮されていません

1.9.3-p125 :049 > dt = DateTime.strptime("2012-04-15 10:00 Central Time (US & Canada)", "%Y-%m-%d %H:%M %Z") 
=> Sun, 15 Apr 2012 10:00:00 -0600 
1.9.3-p125 :050 > dt = DateTime.strptime("2012-04-15 10:00 Central Time (US & Canada)", "%Y-%m-%d %H:%M %Z").utc 
=> Sun, 15 Apr 2012 16:00:00 +0000 
1.9.3-p125 :051 > dt = DateTime.strptime("2012-04-15 10:00 Central Time (US & Canada)", "%Y-%m-%d %H:%M %Z").utc.in_time_zone("Central Time (US & Canada)") 
=> Sun, 15 Apr 2012 11:00:00 CDT -05:00 

、私はUTCに変換する必要があり、その後、戻ってタイムゾーンにDSTを正しく解釈されるように取得するが、その後時間が同様に1時間をシフトしているので、それはない何私が解析されました文字列の誰かがこのバグを回避する方法や、夏時間が正しく表現されているDateTimeオブジェクトに確実に日付+時刻+時間帯を構文解析するより堅牢な方法を持っていますか?ありがとうございました。

編集: わかりましたが、回避策が見つかりましたが、どれほど堅牢かはわかりません。ここで

は一例です:

ActiveSupport::TimeZone["Central Time (US & Canada)"].parse "2012-04-15 10:00" 

これは正しいタイムゾーンに日付/時刻文字列を解析します。私はパースメソッドがこれを処理するためにどのように堅牢であるかわからないので、より良い回避策があるかどうかを見たいと思いますが、これはこれまでの方法です。

答えて

0

これまでこれを処理するための最良の方法がありました。私はlibファイルにユーティリティメソッドを作成しました。

# Returns a DateTime object in the specified timezone 
def self.parse_to_date(date_string, num_hours, timezone) 
    if timezone.is_a? String 
    timezone = ActiveSupport::TimeZone[timezone] 
    end 

    result = nil 
    #Chronic.time_class = timezone # Trying out chronic time zone support - so far it doesn't work 
    the_date = Chronic.parse date_string 
    if the_date 
    # Format the date into something that TimeZone can definitely parse 
    date_string = the_date.strftime("%Y-%m-%d") 
    result = timezone.parse(date_string) + num_hours.to_f.hours 
    end 

    result 
end 

Chronic.parse私は時間の解析に好きほど堅牢ではなかったので、私は手動で時刻に時間を追加注 - それは後続ゼロが8のように、例えば、時間に添加しなかった場合に失敗:8:00の代わりに0:
これは誰かにとって便利だと思います。日付/時刻/タイムゾーン文字列を有効な日付に解析することは非常に一般的なことですが、3つすべてを組み込んだ解析コードを見つけることができませんでした。

+0

このような慢性的な時間帯を設定することができます Chronic.time_class = ActiveSupport :: TimeZone ['Mexico City'] –

5

これは不都合な問題です。あなたが探しているRailsメソッドはTime.zone.parseです。最初にDateTime.strptimeを使用して文字列を解析し、Time.zone.parseを実行してゾーンを設定します。たとえTime.zone年代である-6(CST)オフセット

> Time.zone 
=> (GMT-06:00) Central Time (US & Canada) 
> input_string = "10/12/12 00:00" 
> input_format = "%m/%d/%y %H:%M" 
> date_with_wrong_zone = DateTime.strptime(input_string, input_format) 
=> Fri, 12 Oct 2012 00:00:00 +0000 
> correct_date = Time.zone.parse(date_with_wrong_zone.strftime('%Y-%m-%d %H:%M:%S')) 
=> Fri, 12 Oct 2012 00:00:00 CDT -05:00 

注意、オフセット最終結果のが-5(CDT):次のコンソール出力をチェックしてください。

関連する問題