From: Peter Vandenabeele Date: 2012-01-18T03:00:54+09:00 Subject: Re: Parsing log with date time entry --00248c6a6566a6b4f404b6bd1ccb Content-Type: text/plain; charset=UTF-8 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 --00248c6a6566a6b4f404b6bd1ccb--