Ruby on rails 将本地时区日期迁移到新的Rails应用程序中

Ruby on rails 将本地时区日期迁移到新的Rails应用程序中,ruby-on-rails,datetime,timezone,Ruby On Rails,Datetime,Timezone,我正在将一个基于Perl的web应用程序迁移到Rails。旧应用程序在当地太平洋时间将日期存储在MySql数据库中。例如,有一个创建的字段的值可能为06/06/2008 14:00:00,表示PDT 2008年6月6日下午2:00,而02/02/2002 06:30:00表示PST 2002年2月2日上午6:00 我已经编写了一个rake任务来获取所有旧数据并将其导入新数据库。新数据库中的日期看起来仍然像06/06/2008 14:00:00,但是,当然,我的Rails应用程序将其解释为UTC

我正在将一个基于Perl的web应用程序迁移到Rails。旧应用程序在当地太平洋时间将日期存储在MySql数据库中。例如,有一个创建的字段的值可能为06/06/2008 14:00:00,表示PDT 2008年6月6日下午2:00,而02/02/2002 06:30:00表示PST 2002年2月2日上午6:00

我已经编写了一个rake任务来获取所有旧数据并将其导入新数据库。新数据库中的日期看起来仍然像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中。将\u old\u Event\u转换为\u newevent:

因此,在迁移过程中,在将日期存储在新数据库中之前,我需要从旧数据库中读取日期/时间,将其转换为UTC,然后将其存储在新数据库中

如何做到这一点

>> 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核心库时间对象,该对象可以按照您喜欢的任何方式进行格式化

如果您的时区不是太平洋,请运行您的rake导入任务,如下所示:

$ TZ=PST rake initdb:import # whatever
现在,Rails定义了一个名为DateTime的类型,您可能需要它,它需要实际的整数参数,因此:

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

您确定行TZ=PST rake initdb:import可以工作吗?请记住,旧数据库中的日期和时间全年都在夏令时和非夏令时期间出现。PST不只是非夏令时吗?如果你担心这一点,那就说TZ=PST8PDT ruby等等,但我很确定PST已经是PST8PDT的别名了。
DateTime.civil_from_format :local, *'06/06/2008 14:00:00'.split(/[:\/ ]/).map(&:to_i).values_at(2,0,1,3..5)