[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Operations with Time objects

MeX23

3/13/2008 11:52:00 AM

Hi guys.
I want to know the time remain before an expiration.
If I do t_remained = Time.now - expiration I get a float object.
how can I convert it back to Time(days hours and minute)?

thanks
--
Posted via http://www.ruby-....

7 Answers

MeX23

3/13/2008 12:02:00 PM

0

I have tried this:
>> t = Time.now
=> Thu Mar 13 12:57:47 +0100 2008
>> t1 = Time.now + 1.hours
=> Thu Mar 13 13:58:03 +0100 2008
>> t2 = t1 - t
=> 3615.968256
>> tot = Time.at(t2)
=> Thu Jan 01 02:00:15 +0100 1970

but I don't know why the difference between t1 e t is 2 hours and not 1
hour?
--
Posted via http://www.ruby-....

Gareth Adams

3/13/2008 1:23:00 PM

0

Stefano Bortolotti wrote:
> I have tried this:
>>> t = Time.now
> => Thu Mar 13 12:57:47 +0100 2008
>>> t1 = Time.now + 1.hours
> => Thu Mar 13 13:58:03 +0100 2008
>>> t2 = t1 - t
> => 3615.968256
>>> tot = Time.at(t2)
> => Thu Jan 01 02:00:15 +0100 1970
>
> but I don't know why the difference between t1 e t is 2 hours and not 1
> hour?

a Time object doesn't represent a duration (2 hours) it represents a
point in time (Jan 1st 1970, 2am). There's no standard Ruby object
representing a time duration, but it seems that a Float (number of
seconds) is good enough.

you can always do (num_of_seconds / 1.hour) to give you a fractional
number of hours etc.

Gareth


Rob Biedenharn

3/13/2008 1:28:00 PM

0


On Mar 13, 2008, at 8:02 AM, Stefano Bortolotti wrote:

> I have tried this:
>>> t = Time.now
> => Thu Mar 13 12:57:47 +0100 2008
>>> t1 = Time.now + 1.hours
> => Thu Mar 13 13:58:03 +0100 2008
>>> t2 = t1 - t
> => 3615.968256
>>> tot = Time.at(t2)
> => Thu Jan 01 02:00:15 +0100 1970
>
> but I don't know why the difference between t1 e t is 2 hours and
> not 1
> hour?


irb> t = Time.now
=> Thu Mar 13 09:26:37 -0400 2008
irb> t1 = Time.now + 3600
=> Thu Mar 13 10:26:56 -0400 2008
irb> t2 = t1 - t
=> 3618.385132
irb> Time.at(t2)
=> Wed Dec 31 20:00:18 -0500 1969

Because you're not looking at the time zone (+0100).

-Rob

Rob Biedenharn http://agileconsult...
Rob@AgileConsultingLLC.com


MeX23

3/13/2008 4:11:00 PM

0

Thanks guys! I have done this:

def remaining_time
if expiration != nil
diff = expiration - Time.now

days = (diff / 1.day).to_i
hours = ((diff / 1.hour) % 24).to_i
mins = ((diff / 1.minute) 60).to_i

if diff < 7.days
return days.to_s + "gg, " + hours.to_s + ":" + mins.to_s
else
return "more than 7 days"
end
end
end

I'll try to improve it! If you have some advices, they are wellcomes..
--
Posted via http://www.ruby-....

Rob Biedenharn

3/13/2008 7:23:00 PM

0


On Mar 13, 2008, at 12:11 PM, Stefano Bortolotti wrote:

> Thanks guys! I have done this:
>
> def remaining_time
> if expiration != nil
> diff = expiration - Time.now
>
> days = (diff / 1.day).to_i
> hours = ((diff / 1.hour) % 24).to_i
> mins = ((diff / 1.minute) 60).to_i
>
> if diff < 7.days
> return days.to_s + "gg, " + hours.to_s + ":" + mins.to_s
> else
> return "more than 7 days"
> end
> end
> end
>
> I'll try to improve it! If you have some advices, they are wellcomes..


Since you have 1.day, 1.hour, 1.min, I assume that you have
ActiveSupport and likely have Rails. In any case, you can use
distance_of_time_in_words

http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.ht...

If you want to clean up your own method:

days, dayfrac = diff.divmod(1.day)
hours, hrfrac = dayfrac.divmod(1.hour)
mins, secs = hrfrac.divmod(1.min)

if days >= 7
return "more than 7 days"
else
result = []
result << "%sgg,"%days unless days.zero?
result << "%d:%0d"%[hours,mins]
return result.join(' ')
end

-Rob

Rob Biedenharn http://agileconsult...
Rob@AgileConsultingLLC.com


Siep Korteling

3/13/2008 8:28:00 PM

0

Rob Biedenharn wrote:

> if days >= 7
> return "more than 7 days"
> else
> result = []
> result << "%sgg,"%days unless days.zero?
> result << "%d:%0d"%[hours,mins]
> return result.join(' ')
> end

Also, there is the duration gem :
http://wiki.rubyonrails.org/rails/page... .

Regards,

Siep

--
Posted via http://www.ruby-....

MeX23

3/13/2008 8:52:00 PM

0

Rob Biedenharn wrote:
> If you want to clean up your own method:
>
> days, dayfrac = diff.divmod(1.day)
> hours, hrfrac = dayfrac.divmod(1.hour)
> mins, secs = hrfrac.divmod(1.min)
>
> if days >= 7
> return "more than 7 days"
> else
> result = []
> result << "%sgg,"%days unless days.zero?
> result << "%d:%0d"%[hours,mins]
> return result.join(' ')
> end
>
> -Rob
>
> Rob Biedenharn http://agileconsult...
> Rob@AgileConsultingLLC.com

Thanks Rob, I knew about distance_of_time_in_words but I want my own
method.
Cool the divmod..
--
Posted via http://www.ruby-....