开发者

Migrate local timezone dates into new Rails application

I am migrating a Perl-based web application to Rails. The old application stores dates in a MySql database in local (Pacific) time. For example, there is a created field that might have the value 06/06/2008 14:00:00 representing 2:00 PM June 6, 2008 (PDT) whereas 02/02/2002 06:30:00 represents 6:00 AM February 2, 2002 (PST).

I have written a rake task to take all the old data and import it into the new database. The date in the new database still looks like 06/06/2008 14:00:00 but, of course, my Rails application interprets this as UTC.

The migrating task looks like this:

# 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

The interesting code is in the static method 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 neweven开发者_StackOverflow社区t
end

So, in the migration process, before storing the dates in the new database I need to read the date/times from the old database, convert them to UTC, and then store that in the new database.

How can that be done?


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

This obviously returns a Ruby core library Time object that can be formatted any way you like.

If your time zone is not already Pacific, run your rake import task like:

$ TZ=PST rake initdb:import # whatever

Now, Rails defines a type called DateTime which you may need, and it wants real integer parameters, so:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜