From: Kenichi Kamiya Date: 2012-01-18T03:44:34+09:00 Subject: Re: Parsing log with date time entry Range#=== , need #succ method in Ruby1.9.3 under only #<=>, use Range#cover? 2012/1/18 Peter Vandenabeele : > On Tue, Jan 17, 2012 at 6:12 PM, Christopher Graves wrote: > >> Peter Vandenabeele wrote in post #1041349: >> > On Tue, Jan 17, 2012 at 4:37 PM, Peter Vandenabeele >> > wrote: >> > >> >>> > >> >>> Thanks Robert, >> >>> >> >>> By collect range, how would I say subtract 15 minutes from the current >> >>> time so that I can collect all matches from 14:31:02 through 14:46:02? >> >>> >> >> >> >> 1.9.3p0 :006 > Time.now.to_s >> >>  => "2012-01-17 16:36:06 +0100" >> >> 1.9.3p0 :007 > (Time.now - (15*60)).to_s >> >>  => "2012-01-17 16:21:09 +0100" >> >> >> > >> > Actually, for log files, it may be better to use uniform UTC times. So, >> > no confusion on summer/winter time or servers in different part of >> > the world etc. >> > >> > 1.9.3p0 :029 > Time.now.utc.to_s >> >  => "2012-01-17 15:43:25 UTC" >> > 1.9.3p0 :030 > (Time.now - (15*60)).utc.to_s >> >  => "2012-01-17 15:28:30 UTC" >> > >> > HTH, >> > >> > Peter >> >> Unfortunately I have no control over the format of the logs. I am trying >> to compare the current time to the string value in the logs. >> Any ideas on how to get past the crossing midnight issue? >> >> I came up with is for gathering start and end times but the above looks >> nicer. >> >> s_time = Time.now >> e_time = s_time - 900 >> > > Maybe s_time and e_time are swapped here ? > > >> Either way I now have the start time and end time so how would I make a >> range out of that counting in seconds? >> > > Well, reading the Time documentation I see Time#to_f that may be a useful > number. And then, you could make a range with > > s_time.to_f..e_time.to_f > > Take note that comparisons on floats have their own problems > if the delta between them is very small and they are not integer. > > 1.9.3-p0 :001 > e_time = Time.now.utc >  => 2012-01-17 17:51:46 UTC > 1.9.3-p0 :002 > s_time = e_time - 900 >  => 2012-01-17 17:36:46 UTC > > 1.9.3-p0 :003 > range = s_time.to_f..e_time.to_f >  => 1326821806.2174225..1326822706.2174225 > > 1.9.3-p0 :004 > log_time = Time.now.utc-300 >  => 2012-01-17 17:47:22 UTC > > 1.9.3-p0 :007 > range === log_time.to_f >  => true # that log_time is in the range :-) > > 1.9.3-p0 :008 > range === Time.now.to_f >  => false # now is obviously outside the range :-) > > 1.9.3-p0 :009 > # but, you could simply compare times themselves ... not ! > 1.9.3-p0 :010 >   time_range = s_time..e_time >  => 2012-01-17 17:36:46 UTC..2012-01-17 17:51:46 UTC > 1.9.3-p0 :011 > time_range === Time.now > TypeError: can't iterate from Time >    from (irb):11:in `each' >    from (irb):11:in `include?' >    from (irb):11:in `include?' >    from (irb):11:in `===' >    from (irb):11 >    from /home/peterv/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `
' > > > Strange, obviously, for Float too ... (can't iterate from Float), > but, I can determine if a value is inside a range of Floats. > Why not for Time then ? Time has a <=> operator ... > > 1.9.3-p0 :014 >   range.each{|f| puts f} > TypeError: can't iterate from Float >    from (irb):14:in `each' >    from (irb):14 >    from /home/peterv/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `
' > > > Being relatively newb, I still find it amazing that parts f the script I >> think would be the simplest turns out to be the most difficult. >> > > I may have confused you even more ... (sorry for that). > > I was under the impression you wanted to compare the lines > based on the string representation (in which case those issues > of midnight and mm/dd/yyyy representation etc. would play). > > But if you import the date+time of each line with the code that > Robert proposed above, you end up with "clean" Time instances > that will work properly. > > Sorry for the confusion ... > > HTH, > > Peter