论坛首页 编程语言技术论坛

ruby 计算时间差

浏览 12771 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-29  
    经常我们有类似这样的需求,“时间差不大于3天时……”,那么用Ruby怎么计算时间差呢?这个问题困扰了我好几天,甚至产生了自己用函数去实现的想法,其实大可不必,因为ruby已经为我们做好咯。我用“ruby 时间差”关键字在百度没找到答案,最终用“ruby time diffrence" google到了答案。尊重版权,参考链接http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/169234

1、计算两个时间相差的天数
DateTime.parse("2007-12-28") - DateTime.parse("2007-12-26")=>2
2、计算两个时间相差的秒数
(DateTime.parse("Dec  2 03:12:19 2005") - DateTime.parse("Dec 2 14:44:47 2005")) * 24 * 60 * 60 =>-41548


上面例子中的字符串只要符合时间日期的形式就ok了,仅供需要的人参考
   发表时间:2007-12-29  
你可以借鉴一下Rails关于Ruby数值的扩展
比如以下例子:
D:\workspaces\runwell>ruby script/console
Loading development environment (Rails 2.0.2)
>> 10.minutes.ago
=> Sat Dec 29 17:22:37 +0800 2007
>> 20.days.from_now
=> Fri Jan 18 17:32:56 +0800 2008
>> 10.months.until("2008-10-10 12:00:00".to_time)
=> Mon Dec 10 12:00:00 UTC 2007
>> 10.months.since("2001-10-10 12:00:00".to_time)
=> Sat Aug 10 12:00:00 UTC 2002

0 请登录后投票
   发表时间:2007-12-29  
如果非常频繁计算时间差的话,建议用Time,因为Time要比DateTime效率来的高。

Time#to_i得到的值就是自epoc以来的秒数,此值可用做时间差的数学运算。
0 请登录后投票
   发表时间:2008-01-01  
用dateTime,直接'-'

today=DateTime.now
yest=today.yesterday
(today-yest).to_i ==>1
0 请登录后投票
   发表时间:2008-01-03  
rubynroll 写道
如果非常频繁计算时间差的话,建议用Time,因为Time要比DateTime效率来的高。

Time#to_i得到的值就是自epoc以来的秒数,此值可用做时间差的数学运算。


可否这样:日期差用DateTime,其它时间差用Time。
仁兄“建议用Time,因为Time要比DateTime效率来的高”是怎么回事呢??
0 请登录后投票
   发表时间:2008-01-04  
主要原因可能是因为DateTime是纯Ruby写的,而Time是C写的。

以前看过一篇别人的blog谈到DateTime和Time的比较,不过今天却打不开链接了,我把他的两个benchmark测试代码帖上来,你可以试试在你的机器上两个性能差多少?


使用DateTime:
#!/usr/bin/ruby
require 'date'
require 'benchmark'
include Benchmark

todays_date = DateTime.parse('Mon Feb 20 22:59:35 EST 2006')
yesterdays_date = DateTime.parse('Sun Feb 19 20:49:59 EST 2006')
difference = todays_date - yesterdays_date
hours,minutes,seconds,frac = DateTime.day_fraction_to_time(difference)
puts "#{hours}:#{minutes}:#{seconds}" 

bm() do |x|
  x.report('Date') {
    500.times {
      todays_date = DateTime.parse('Mon Feb 20 22:59:35 EST 2006')
      yesterdays_date = DateTime.parse('Sun Feb 19 20:49:59 EST 2006')
      difference = todays_date - yesterdays_date
      hours,minutes,seconds,frac = DateTime.day_fraction_to_time(difference)
    }
  }
end


使用Time:

#!/usr/bin/ruby
require 'time'
require 'benchmark'
include Benchmark

todays_date = Time.parse('Mon Feb 20 22:59:35 EST 2006')
yesterdays_date = Time.parse('Sun Feb 19 20:49:59 EST 2006')
difference = todays_date - yesterdays_date
minutes_to_add = difference.div(60)
seconds = difference.to_i.modulo(60)
hours = minutes_to_add.div(60)
minutes = minutes_to_add.modulo(60)
puts "#{hours}:#{minutes}:#{seconds}" 

bm() do |x|
  x.report('Date') {
    500.times {
      todays_date = Time.parse('Mon Feb 20 22:59:35 EST 2006')
      yesterdays_date = Time.parse('Sun Feb 19 20:49:59 EST 2006')
      difference = todays_date - yesterdays_date
      minutes_to_add = difference.div(60)
      seconds = difference.modulo(60)
      hours = minutes_to_add.div(60)
      minutes = minutes_to_add.modulo(60)
    }
  }
end
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics