【问题标题】:Rails: seeding database data and date formatsRails:播种数据库数据和日期格式
【发布时间】:2011-07-25 08:30:44
【问题描述】:

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

我正在播种的数据涉及一个名为 Meeting 的数据库表,该表具有三列:字符串标题、日期时间 startDate、日期时间 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")
  }])

【问题讨论】:

  • 尝试将零添加到小时 :startDate => DateTime.parse("09/14/2009 08:00")
  • @fl00r 不,那没用;我为“09/01/2009 08:00”添加了一个种子并且有效。困难的是日期。
  • 尝试将日期以更明显的格式供解析器使用:2009-09-01 8:00
  • 我正在播种 700 个日期;重写它们不是一种选择。坦率地说,我的谷歌搜索表明 mm/dd/yyyy 是解析器的明显格式。 :)

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


【解决方案1】:

你可以试试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")
  }])

【讨论】:

    【解决方案2】:

    请改用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)
      }
    ])
    

    【讨论】:

    • 别忘了 :startDate => DateTime.new(2009,9,14,8) 中的逗号,
    • 添加了缺少的逗号。谢谢@Acrux。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 1970-01-01
      • 2010-12-04
      • 2011-12-12
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      相关资源
      最近更新 更多