24

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

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

誰かがこれを行う正しい方法について教えてもらえますか?

4

8 に答える 8

13

私は次のように使用します。

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

それはあなたが意味するものですか?

于 2011-10-26T21:53:37.613 に答える
5

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
于 2016-12-29T00:50:11.587 に答える
1

私はこの文字列を「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

特にエレガントではありませんが、機能します。

于 2014-09-09T02:16:29.127 に答える
0

で日付をタイムゾーンに変換できますto_time_in_current_zone。例えば:

Date.strptime('04/07/1988', '%m/%d/%Y').to_time_in_current_zone
于 2013-06-16T07:32:07.227 に答える
-3

承認済みの回答を削除できません

以下のコメント セクションで @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_classUTC に変換するようにしてください (ドキュメントでは、Chronic は:time_classparse を呼び出す前に設定します。アプリケーション全体の他の部分が機能しなくなる可能性があるため、このアプローチは避けています)。

TimeZone のドキュメントは http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.htmlにあります。

于 2013-04-03T11:55:22.223 に答える