我是一个新手,真的被ruby中不同的时间和日期格式所困扰。直到现在我才知道怎么绕过他们。本例中我使用
find_or_initialize_by_sessiondate_and_person_id()并且它总是创建一个新记录,因为(显然)它不识别从数据库中取出的日期与提供的日期相同。我正在从CSV文件中读取数据,输入看起来像:
Fri Apr 22 15:09:00 2011
活动记录不抱怨这种格式-它把它放在一个datetime字段在数据库(sqlite,但我想解决方案的工作在其他DB的)很好。我尝试在输入中添加时区,如下所示:
createdate = DateTime.strptime(record_split[ 4 ].chomp + " UTC","%a %b %e %T %Y %Z"
session = Session.find_or_initialize_by_sessiondate_and_person_id(createdate, person.id)
if session.new_record?
puts "new record for #{person.name}, #{createdate.inspect}, #{session.sessiondate.inspect}"
输出如下:
new record for Mickey Mouse, Fri, 22 Apr 2011 15:09:00 +0000, Fri, 22 Apr 2011 15:09:00 UTC +00:00
这当然看起来像相同的日期/时间对我来说,为什么是ActiveRecord创建一个新的记录?
我对正在发生的事情有点困惑。从你的例子中,我最关心的事情是"星期二Oct 5 19:43:23 2010"被转换为"星期五,22 Apr 2011 15:09:00 +0000"(除非你为每个例子使用不同的日期…)
为方便起见,您最好直接使用Time.parse
而不是DateTime.strptime
:
ree-1.8.7-2010.02 > Time.parse("Tue Oct 5 19:43:23 2010")
=> Tue Oct 05 19:43:23 +1100 2010
另一件需要考虑的事情是,在内部,Rails 3将所有时间戳存储为UTC;然后实时显示默认时区的时间。
最后,根据原始时间戳字段是如何生成的(即Time。现在,与解析字符串相比,您可能会遇到精度问题。如果createdate
是用Time填充的。现在,您可能会发现它已被持久化为一个精确到微秒的值(例如:'19:43:23.34131'),与您解析的时间('19:43:23.00000')相比,它并不严格相等。
可能是因为person_id
不同?
这个DateTimes也有一点不同:
Fri, 22 Apr 2011 15:09:00 +0000
vs
Fri, 22 Apr 2011 15:09:00 UTC +00:00
用UTC存储日期总是一个好主意,所以你可以在你的模型中有这样的东西:
def sessiondate=(dt)
write_attribute(:sessiondate, Time.parse(dt).utc)
end
您的日期时间。新…不工作在我的Rails 3.0.7,但我可以建议你关于另一种方式,这是我在Rails控制台的测试:
ruby-1.9.2-p136 :028 > v = Video.new :title => "toto"
=> #<Video id: nil>
ruby-1.9.2-p136 :029 > v.save
=> true
ruby-1.9.2-p136 :030 > v
=> #<Video id: 507>
v。Id = 507
ruby-1.9.2-p136 :032 > v.created_at = "Tue Oct 5 19:43:23 2010" #I use your datetime
=> "Tue Oct 5 19:43:23 2010"
ruby-1.9.2-p136 :033 > v.save
=> true
ruby-1.9.2-p136 :034 > v.created_at
=> Tue, 05 Oct 2010 19:43:23 UTC +00:00
ruby-1.9.2-p136 :035 > v2 = Video.find_or_initialize_by_created_at("Tue Oct 5 19:43:23 2010")
=> #<Video id: nil, ... , created_at: "2010-10-05 19:43:23", ... >
ruby-1.9.2-p136 :039 > v2.save
=> true
ruby-1.9.2-p136 :040 > v2
=> #<Video id: 508>
新记录,v.id = 507 and v2 = 508 !
... > v3 = Video.
find_or_initialize_by_created_at("Tue Oct 5 19:43:23 2010".to_datetime)
现在是String。日期字符串上的To_datetime方法
=> #<Video id: 507> # We get v !!!
ruby-1.9.2-p136 :043 > v == v3
=> true
p。s:这是一个I18n应用程序,这就是为什么你没有看到标题属性。