Time Compare


#1

Hello all

is there any direct comparison function in ruby or in rails for time

I need a function which compare current time is between 2 time objects
or not

Please help me

thanks in advance


#2

Cyrus D. schrieb:

thanks in advance
my first solution would be to put the three time objects in an Array:
now = Time.now
timebefore = now - 306060
timeafter = now + 306060
timearray = [now, timebefore, timeafter]
and after that using
timearray.sort
to sort them. If now is between the two dates if should be on position 1


#3

now = Time.now
yesterday=now-1.day
tomorrow=now+1.day

is_between = true if now > yesterday and now < tomorrow

So… you want to know if


#4

badboy wrote:

Cyrus D. schrieb:

thanks in advance
my first solution would be to put the three time objects in an Array:
now = Time.now
timebefore = now - 306060
timeafter = now + 306060
timearray = [now, timebefore, timeafter]
and after that using
timearray.sort
to sort them. If now is between the two dates if should be on position 1

Or put the time objects in a range.

timeslot = (Time.now+1…Time.now+2)

use like this:

4.times do
puts timeslot.include?(Time.now)
sleep 1
end

hth,

Siep


#5

Since Time uses Comparable, then why not use .between? method
(http://www.ruby-doc.org/core/classes/Comparable.html#M007548):

t = Time.now
t_before = t - 10
t_after = t + 10

puts t.between?(t_before, t_after)


#6

Jarmo P. wrote:

Since Time uses Comparable, then why not use .between? method
(http://www.ruby-doc.org/core/classes/Comparable.html#M007548):

(Note that #between includes the boundaries. You have more control when
you use explicit > and < )


#7

Robert K. wrote:

is_between = now > yesterday and now < tomorrow

Danger danger!!!

irb(main):012:0> foo = 3 > 1 and 3 < 2
=> false
irb(main):013:0> foo
=> true

‘and’ and ‘or’ have lower precedence even than ‘=’, so it’s parsed as

(foo = 3 > 1) and (3 < 2)

The moral is: don’t use these very-low precedence operators unless you
really know what you’re doing. And even then, use parentheses to be
sure. Learned the hard way :slight_smile:

Regards,

Brian.


#8

Hi,

Am Dienstag, 27. Jan 2009, 17:20:13 +0900 schrieb Robert K.:

is_between = now > yesterday && now < tomorrow
is_between = now > yesterday and now < tomorrow

Sorry, Robert, but in the second case the binding is

(is_between = now > yesterday) and now < tomorrow

Or

irb(main):001:0> a,b,c=1,4,2
=> [1, 4, 2]
irb(main):002:0> i = b>a and b<c
=> false
irb(main):003:0> i
=> true

A common Ruby pitfall…

Bertram


#9

Brian C. removed_email_address@domain.invalid writes:

‘and’ and ‘or’ have lower precedence even than ‘=’, so it’s parsed as

(foo = 3 > 1) and (3 < 2)

The moral is: don’t use these very-low precedence operators unless you
really know what you’re doing. And even then, use parentheses to be
sure. Learned the hard way :slight_smile:

That’s the second time today I notice that you are required to use
parentheses in Ruby (cf. m(arg){block}). Would that be a Lots of
Insipid and Stupid Parentheses language?

In anycase, I’ve got too small a brain to remember such rules, I put
parentheses everywhere.


#10

2009/1/17 list. rb removed_email_address@domain.invalid:

now = Time.now
yesterday=now-1.day
tomorrow=now+1.day

is_between = true if now > yesterday and now < tomorrow

Sorry for interrupting you, but this is not a safe idiom. Why?
Because of this: assuming someone had used “is_between” before then
chances are that the value is logical true (there are far more true
values than false values). If the date is not in between you still
retain the old value of x. Instead, rather do the assignment
unconditionally:

is_between = now > yesterday && now < tomorrow
is_between = now > yesterday and now < tomorrow

You can as well do

is_between = (yesterday…tomorrow).include? now

but this has a slightly different semantics because it will also be
true if your test time matches one of the boundaries.

Kind regards

robert


#11

The moral is: don’t use these very-low precedence operators unless you
really know what you’re doing. And even then, use parentheses to be
sure. Learned the hard way :slight_smile:

That’s the second time today I notice that you are required to use
parentheses in Ruby (cf. m(arg){block}). Would that be a Lots of
Insipid and Stupid Parentheses language?

Only if you had to use them all the time, and put them in the wrong
place :slight_smile:

In anycase, I’ve got too small a brain to remember such rules, I put
parentheses everywhere.

That’s always the safe bet.

You could argue that Ruby would have been a better language if ‘and’,
‘or’ and ‘not’ were removed completely. I wouldn’t disagree, but it’s
easy to avoid them when you know.

BTW, Perl has exactly the same problem too. Some of the following work,
and some don’t. But because Perl doesn’t make such wide use of
exceptions, this is a common idiom:

open FILE, “/etc/mot” or die “No such file”;
open FILE, “/etc/mot” or die(“No such file”);
open FILE, “/etc/mot” || die “No such file”;
open FILE, “/etc/mot” || die(“No such file”);
open(FILE, “/etc/mot”) or die “No such file”;
open(FILE, “/etc/mot”) or die(“No such file”);
open(FILE, “/etc/mot”) || die “No such file”;
open(FILE, “/etc/mot”) || die(“No such file”);


#12

2009/1/27 Brian C. removed_email_address@domain.invalid:

‘and’ and ‘or’ have lower precedence even than ‘=’, so it’s parsed as

(foo = 3 > 1) and (3 < 2)

The moral is: don’t use these very-low precedence operators unless you
really know what you’re doing. And even then, use parentheses to be
sure. Learned the hard way :slight_smile:

Thanks for the heads up! Originally I did not have the “and” version
in because I usually use the “&&” just because of the precedence issue
you mention. Somehow reading the other “and” version tricked my into
believing it would be safe here.

Mantra of the day: Always test! Always test! Always test! :slight_smile:

Cheers

robert