ActiveRecord将字符串解析为datetime?

如果我在创建新的AR对象时将String传递给Datetime列,它将自动解析:

 1.9.2p290 :011 > Movie.new(:release_date=>"21-Nov-1990") => # 

RailsActiveRecord如何做到这一点? 它使用哪种方法?

Rails为String添加了to_date方法。 它的来源很简单:

 # File activesupport/lib/active_support/core_ext/string/conversions.rb, line 42 def to_date return nil if self.blank? ::Date.new(*::Date._parse(self, false).values_at(:year, :mon, :mday)) end 

Date._parse是Ruby的原生(相同的方法由Date.parse ),它就是真正工作的地方 。

它首先使用正则表达式从字符串中删除无关符号,然后将其传递给其他方法,如_parse_eu_parse_iso_parse_dot等。 这些中的每一个都使用自己的正则表达式和其他方法来查看它是否是它理解的日期并从中提取有意义的信息。 一旦其中一个“工作”(即返回true),其余部分将被跳过。 最后,在_parse ,提取的信息用于构建日期和时间,做一些工作来弄清楚诸如检查星期几以及年份值“12”是否应该表示1912或2012的事情。

文档称这是一种启发式方法,可以理解为它会在墙上抛出一堆可能性以查看是什么。 它的记录很差,但效果非常好。

如果你需要时间,还有to_datetime

您可能想要使用Date.strptime(str)

正如其他注释和文档所示, String#to_datetime “将字符串转换为DateTime值。”:

 "1-1-2012".to_datetime # => Sun, 01 Jan 2012 00:00:00 +0000 "01/01/2012 23:59:59".to_datetime # => Sun, 01 Jan 2012 23:59:59 +0000 "2012-12-13 12:50".to_datetime # => Thu, 13 Dec 2012 12:50:00 +0000 "12/13/2012".to_datetime # => ArgumentError: invalid date