2011-01-16 10 views
0

PerlベースのWebアプリケーションをRailsに移行しています。古いアプリケーションは、ローカル(太平洋)時代にMySqlデータベースに日付を格納します。たとえば、createdフィールドの値は06/06/2008 14:00:00で、2008年6月6日午後2時(PDT)になります。02/02/2002 06:30:00は2002年2月2日(PST)の午前6時を表します。ローカルのタイムゾーンの日付を新しいRailsアプリケーションに移行する

古いデータをすべて取り出して新しいデータベースにインポートするレーキタスクを作成しました。新しいデータベースの日付がまだの場合は06/06/2008 14:00:00のようにと表示されますが、私のRailsアプリケーションではUTCと解釈されます。

の移行作業は、次のようになります。

# Migrating old events in Perl application to new events in Rails 
oldevents = OldEvent.all 
oldevents.each do |oldevent| 
    newevent = Event.convert_old_event_to_newevent(oldevent) 
    newevent.save! 
end 

興味深いコードは、静的メソッドEvent.convert_old_event_to_neweventである:

def Event.convert_old_event_to_newevent(oldevent) 
    ... 
    # If the "created" field in the old db contains '06/06/2008 14:00:00' (meaning 
    # 2:00 PM PDT (since June is during daylight savings time) then the 
    # "created_at" field in the new database will contain the same string which 
    # Rails interprets as 2:00 PM GMT. 
    newevent.created_at = oldevent.created 
    ... 
    return newevent 
end 

ので、移行プロセスでは、新しいデータベースで日付を格納する前に私は古いデータベースから日付/時刻を読んで、それらをUTCに変換し、それを新しいデータベースに保存する必要があります。

どうすればできますか?

答えて

0
>> Time.local(*'06/06/2008 14:00:00'.split(/[:\/ ]/).values_at(2,0,1,3..5)).utc 
=> Fri Jun 06 21:00:00 UTC 2008 

明らかに、好きなように書式設定できるRubyコアライブラリTimeオブジェクトが返されます。

タイムゾーンが既に太平洋でない場合は、のようなあなたのすくいインポートタスクを実行します。

$ TZ=PST rake initdb:import # whatever 

ので、Railsはあなたが必要とするかもしれ日時と呼ばれるタイプを定義し、それが本当の整数パラメータを望んでいる:

DateTime.civil_from_format :local, *'06/06/2008 14:00:00'.split(/[:\/ ]/).map(&:to_i).values_at(2,0,1,3..5) 
+0

「TZ = PST rake initdb:import」という行は確実に機能しますか?古いデータベースの日付と時刻は、夏時間と非夏時間の両方で年間を通じて発生します。 PSTは夏時間以外ではありませんか? – rlandster

+0

あなたが心配しているのなら、** TZ = PST8PDT ruby​​ ** * blah blah *と言うだけですが、私はかなり確信しています** PST **は** PST8PDT **のエイリアスです。 – DigitalRoss

関連する問題