`
zengyinbo
  • 浏览: 21119 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ruby 计算时间差

阅读更多
    经常我们有类似这样的需求,“时间差不大于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了,仅供需要的人参考
分享到:
评论
5 楼 rubynroll 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
4 楼 zengyinbo 2008-01-03  
rubynroll 写道
如果非常频繁计算时间差的话,建议用Time,因为Time要比DateTime效率来的高。

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


可否这样:日期差用DateTime,其它时间差用Time。
仁兄“建议用Time,因为Time要比DateTime效率来的高”是怎么回事呢??
3 楼 dazuiba 2008-01-01  
用dateTime,直接'-'

today=DateTime.now
yest=today.yesterday
(today-yest).to_i ==>1
2 楼 rubynroll 2007-12-29  
如果非常频繁计算时间差的话,建议用Time,因为Time要比DateTime效率来的高。

Time#to_i得到的值就是自epoc以来的秒数,此值可用做时间差的数学运算。
1 楼 neodoxy 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

相关推荐

    Ruby-timediff计算两个时间相差多少的Gem

    此外,"Ruby-timediff" Gem还支持链式调用,允许你在计算时间差后立即转换为所需的单位。例如: ```ruby difference_in_minutes = diff_obj.in_minutes difference_in_hours = diff_obj.in_hours ``` 这样,你可以...

    Ruby-timelord为时间类添加一些扩展功能

    1. **时间间隔的友好显示**:通过调用特定方法,将时间差转换为"秒"、"分钟"、"小时"、"天"等单位的组合,例如`time_ago_in_words`方法。 2. **自定义格式化**:可以定制日期和时间的输出格式,比如使用`strftime`...

    指定两个日期计算相隔的天数

    其他如Java、C#、Ruby等语言也有类似的日期处理方法,通过日期对象的属性或方法计算两个日期间的差异。 5. **工具和库**: 在数据分析领域,像Pandas(Python)和R语言的`difftime`函数也提供了简便的日期差计算...

    time_difference:缺少的Ruby方法可以打印出年,月,周,日,时,分和秒的时差(持续时间)

    对于早期版本,请查看时间差异TimeDifference是缺少的Ruby方法,无法计算两个给定时间之间的时差。 您可以在年,月,周,日,小时,分钟和秒之间进行Ruby时差。安装将此行添加到您的应用程序的Gemfile中: gem '...

    Time-Series-Anomaly-Detection:关于时间序列数据分析的异常Ruby示例,用于检测异常值(异常)

    在Ruby中实现这两种方法,你需要导入必要的库,例如`mathn`或`statsample`,并编写函数来计算Z-score和IQR。然后,你可以遍历时间序列数据,应用这些函数来标记潜在的异常值。 为了更好地应用这些方法,你需要先...

    CodeForces – 1323D Present(思维+数学)

    题目分析:如果暴力的话显然时间复杂度是 n * n 的,我们应该想办法去优化,比赛的时候想用线段树,但是不会在维护异或的前提下区间加法,也想过用矩阵维护,但丝毫没什么用呀,队友想到了可以按位维护,也就是维护...

    timeago时间转化

    主要步骤包括计算时间差,判断时间单位(秒、分钟、小时、天等),并根据时间差进行转换。 **七、时间ago的本地化** timeago库通常支持多语言环境,可以根据用户的语言设置显示对应的语言版本,比如英文的"2 ...

    redis-3.0.0.gem.rar

    例如,`sadd`添加元素到集合,`sinter`、`union`和`sdiff`分别计算两个集合的交、并和差。 4. **有序集合(Sorted Sets)**:有序集合在集合的基础上增加了分数字段,可以按分数排序。`zadd`用于添加元素并指定分数...

    howLongUntilNow:算算这一年到现在为止花了多长时间?

    类似地,可以先将输入转换为`LocalDate`对象,再与今天的日期进行比较,计算出两个日期之间的天数差。 无论是Ruby还是Java,这样的工具都具有实用性,尤其是在需要快速计算日期间隔而不想依赖复杂库的场景下。此外...

    日本每月交通事故

    5. **时间序列分析**:由于是“每月”交通事故,我们需要处理时间序列数据,可能涉及日期和时间的操作,例如计算月度增长率、季节性趋势等。 6. **统计学概念**:理解并应用基本的统计概念,如标准差、方差,以评估...

    计算机语言的发展简介,总的来说计算机语言可分成机器语言,汇编语言,高级语言三大类。

    随着时间的推移,出现了更多类型的高级语言,如面向对象的语言(如C++和Java),函数式语言(如Lisp和Haskell),脚本语言(如JavaScript和Perl),以及现代的多范式语言(如Python和Ruby)。这些语言各有特点,适应...

    jekyll-time:Jekyll插件集合,用于计算基于时间的数据

    Jekyll时间插件 一组插件,用于计算基于时间的数据。...计算两个时间值的时差。 {{ '9:00AM' | time_diff:'11:30AM' }} {{ '9:00AM' | time_diff:'11:30AM' }} => 2:30h 您还可以混合时间格式。 {{

    timestampcounter

    有了这个基础,你可以根据具体需求扩展这个功能,例如统计特定时间段内的事件数量、计算事件之间的时差或者按日期排序事件等。如果需要对多个文件执行此操作,可以使用文件名列表迭代,并将上述代码封装到一个函数或...

    各种语言获取Unix时间戳的方法

    ### 各种语言获取Unix时间戳的方法 ...每种语言都有其独特的实现方式,但核心原理是相似的:都是基于当前时间与1970年1月1日之间的时间差来计算Unix时间戳。希望本文能够帮助开发者们更好地理解和应用Unix时间戳。

    不同编程语言中对时间类型的获取和转换.docx

    - `DateDiff("s", "01/01/1970 00:00:00", Now())` 计算两个日期之间的秒数差,从而获得 UNIX 时间戳。 8. Java: - 使用 `java.text.SimpleDateFormat` 类和 `java.util.Date` 类可以格式化日期。例如,`new ...

    史上最全开发速查表

    - `getTimezoneOffset()`: 获取本地时间与格林尼治标准时间之间的时差,以分钟为单位。 - `getUTCDate()`: 获取按照 UTC 计算的日期。 - `getUTCDay()`: 获取按照 UTC 计算的星期几。 - `getUTCFullYear()`: ...

    rails性能优化

    在优化时,不仅要关注平均值,还应该计算最小值、最大值和标准差,标准差能够反映出数据的可靠性。 性能调优还需要借助各种基准测试工具,其中包括Rails自带的日志文件(需调试级别设置为Logger::DEBUG或更高)、...

Global site tag (gtag.js) - Google Analytics