在Ruby on Rails中比较时间或放弃日期

6

我从数据库中获取了一些时间数据,数据长这样:

ruby-1.9.2-p290 :017 > djel.smjena.pocetak1.to_time 
 => 2000-01-01 08:00:00 +0100 

没问题,它将我分配到了2000年1月1日。另外,我得到了一些发生在某个日期时间的东西。

ruby-1.9.2-p290 :019 > dog.pocetak 
 => Thu, 25 Aug 2011 08:18:00 UTC +00:00 

我曾希望.to_time方法能去除我的日期部分,但事实并非如此。

ruby-1.9.2-p290 :020 > dog.pocetak.to_time 
 => Thu, 25 Aug 2011 08:18:00 UTC +00:00 

所以,现在比较8:00之前是否发生了某事是没有意义的。那么,我该如何进行比较呢?有没有办法在不改变时钟的情况下将dog.pocetak设置为2000-01-01?

谢谢。

p.s. 我也考虑过创建一个新的时间变量,只获取旧变量的小时和分钟,但这种方法行不通吗?

ruby-1.9.2-p290 :059 > dog.pocetak.hour
 => 8

但是
ruby-1.9.2-p290 :060 > dog.pocetak.minute
NoMethodError: undefined method `minute' for 2011-08-25 08:18:00 UTC:Time
        from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.10/lib/active_support/time_with_zone.rb:322:in `method_missing'
        from (irb):60
        from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:44:in `start'
        from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:8:in `start'
        from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands.rb:23:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
ruby-1.9.2-p290 :061 > dog.pocetak.minutes
NoMethodError: undefined method `minutes' for 2011-08-25 08:18:00 UTC:Time
        from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.10/lib/active_support/time_with_zone.rb:322:in `method_missing'
        from (irb):61
        from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:44:in `start'
        from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:8:in `start'
        from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands.rb:23:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'

真的很令人沮丧 :)
2个回答

3
要从时间对象中获取分钟数,您需要使用min而不是minutes。您不能拥有仅表示“一天中的时间”(即没有年份、月份等)的时间实例,但可以使用strftime获取字符串版本,以便进行比较:
tod = Time.now.strftime('%H:%M:%S')
# "17:07:23"

if(t1.strftime('%H:%M:%S') == t2.strftime('%H:%M:%S'))
    # Same time of day (to one second resolution)
end

或者你可以比较单独的小时分钟秒钟组件:

if(t1.hour == t2.hour && t1.min == t2.min && t1.sec == t2.sec)
    # Same time of day (to one second resolution)
end

你采取哪种方法取决于你的具体情况以及周围其他事情的发展。

该句涉及IT技术,需要根据上下文进行翻译,但是没有具体的技术术语,因此直接翻译即可。

3
使用ActiveSupportTime.change,您可以重置年、月和日,如果需要的话:
> t = Time.now
=> Sun Aug 21 00:46:29 +0000 2011
> t.change(:month => 1, :day => 1, :year => 2000)
=> Sat Jan 01 00:46:29 +0000 2000

这样,如果它们都被重置为相同的日期,您就可以比较彼此之间的“时间”。不确定这是否是一个好的解决方案,这取决于您真正寻找的内容。
编辑:根据mu的建议,您还可以查看time数据类型。

PostgreSQL和MySQL都有“时间”数据类型,PostgreSQL还有一个间隔类型(MySQL的“时间”既可以表示一天中的时间,也可以表示时间间隔)。我希望其他数据库也有类似的类型(虽然它们都有微妙的不兼容之处,因为标准总是如此)。 - mu is too short
@mu - 感谢您的澄清,mu。我怎么会错过那个..嗯。需要多睡觉。已编辑。 - Casper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接