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

Posted

技术标签:

【中文标题】Rails:播种数据库数据和日期格式【英文标题】:Rails: seeding database data and date formats 【发布时间】: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 是解析器的明显格式。 :) 【参考方案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

【讨论】:

以上是关于Rails:播种数据库数据和日期格式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 使用CSV文件播种Rails数据库

如何为具有范围批量分配的 Rails 3.1 应用程序播种

更改 Rails 4 中的默认日期和时间格式

创建一个 cron 以自动启动数据库播种器

后台播种/加载 iOS 核心数据存储

Rails:如何将日期时间字符串解析为特定时区