Rails:播种数据库数据和日期格式

时间:2011-03-29 14:29:02

标签: ruby ruby-on-rails-3 data-migration

我正在尝试使用db / seed.rb文件和rake db:seed命令将一些数据植入我正在开发的Rails 3应用程序中。

我播种的数据涉及一个名为Meeting的数据库表,它有三列:string title,datetime startDate,datetime endDate。我试图插入的日期时间是“mm / dd / yyyy hh:mm”格式 - 例如。 “01/02/2003 13:23”= 2003年1月2日下午1:23。但是,DateTime.parse()始终错误地显示“无效日期”错误 - 因为它尝试以“dd / mm / yyyy”格式解析日期。

从我的谷歌搜索,我被引导相信,在解析DateTime对象时,编译器会查看传入的字符串并进行一些仓促的模式匹配,然后映射“mm / dd / yyyy”和“dd-mm- yyyy“相应地根据美国/英国(等)标准,基于是使用斜线还是破折号作为分隔符。然而,情况似乎并非如此,我想知道为什么。以及如何解决它。

这就是我为会议播种的方式 - 第一个正确解析,第二个失败。

Meeting.create([
  {
    :title => "This meeting parses fine",
    :startDate => DateTime.parse("09/01/2009 17:00"),
    :endDate => DateTime.parse("09/01/2009 19:00")
  },
  {
    :title => "This meeting errors out",
    :startDate => DateTime.parse("09/14/2009 8:00")
    :endDate => DateTime.parse("09/14/2009 9:00")
  }])

3 个答案:

答案 0 :(得分:12)

您可以尝试Date.strptime

:startDate => DateTime.parse("09/14/2009 8:00") 
#=> 
:startDate => DateTime.strptime("09/14/2009 8:00", "%m/%d/%Y %H:%M")

所以

Meeting.create([
  {
    :title => "This meeting parses fine",
    :startDate => DateTime.strptime("09/01/2009 17:00", "%m/%d/%Y %H:%M"),
    :endDate => DateTime.strptime("09/01/2009 19:00", "%m/%d/%Y %H:%M")
  },
  {
    :title => "This meeting errors out",
    :startDate => DateTime.strptime("09/14/2009 8:00", "%m/%d/%Y %H:%M")
    :endDate => DateTime.strptime("09/14/2009 9:00", "%m/%d/%Y %H:%M")
  }])

答案 1 :(得分:9)

请改用DateTime.new。不用担心正确的解析。

Meeting.create([
  {
    :title      => "This meeting parses fine",
    :startDate  => DateTime.new(2009,9,1,17),
    :endDate    => DateTime.new(2009,9,1,19)
  },
  {
    :title      => "This meeting errors out",
    :startDate  => DateTime.new(2009,9,14,8),
    :endDate    => DateTime.new(2009,9,14,9)
  }
])

答案 2 :(得分:2)

如果输入时间的细节不重要,您可以完全跳过以下格式:

Time.now.to_datetime
Time.now.to_datetime.end_of_day