Forum: Ruby want only the working hours(9am-5pm) between two dates

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
44d59c6c5a7e3435409ebe94c9aa9db5?d=identicon&s=25 Srikanth Jeeva (srikanth_j)
on 2008-12-10 13:18
want only the working hours(9am-5pm) between two dates, weekends should
be omitted..

i did this code..

require 'time'
require 'date'
class Date
  def calc(date1,date2)

    d1=Time.parse(date1).strftime('%d').to_i
    m1=Time.parse(date1).strftime('%m').to_i
    y1=Time.parse(date1).strftime('%Y').to_i
    t1=Time.parse(date1).strftime('%H').to_i
    min1=Time.parse(date1).strftime('%M').to_i

    date1 = Date.new( y1, m1, d1 )

    d2=Time.parse(date2).strftime('%d').to_i
    m2=Time.parse(date2).strftime('%m').to_i
    y2=Time.parse(date2).strftime('%Y').to_i
    t2=Time.parse(date2).strftime('%H').to_i

    date2 = Date.new( y2, m2, d2 )
    weekdays = (date1..date2).reject { |d| [0,6].include? d.wday }
    w= weekdays.length
    working_hours=w*8
    puts "working hours = #{working_hours}"

  end
  end

  d=Date.new
  d.calc("November 5th, 2008, 10:30 am","November 7th, 2008, 6:00 pm")

i have calculated the total working hours..
but i need the total hours between 9am-5pm, between the given dates..
can any one plz help??
thanks.,

Regards,
Srikanth J
753dcb78b3a3651127665da4bed3c782?d=identicon&s=25 Brian Candler (candlerb)
on 2008-12-10 14:26
Srikanth Jeeva wrote:
> but i need the total hours between 9am-5pm, between the given dates..
> can any one plz help??

Not sure what you mean. Do you mean (date2 - date1 + 1) * 8 ?

Use to_i on the answer if you don't want Rational arithmetic.
44d59c6c5a7e3435409ebe94c9aa9db5?d=identicon&s=25 Srikanth Jeeva (srikanth_j)
on 2008-12-10 14:39
Brian Candler wrote:
> Srikanth Jeeva wrote:
>> but i need the total hours between 9am-5pm, between the given dates..
>> can any one plz help??
>
> Not sure what you mean. Do you mean (date2 - date1 + 1) * 8 ?
>
> Use to_i on the answer if you don't want Rational arithmetic.

hi brain,

i mean..

date1="November 5th, 2008, 10:30 am"
date2="November 7th, 2008, 6:00 pm"

i want only the working hours between 10:30 am to 6.00 pm,in these
dates...

date can also be,

date1="March 5th, 2005, 5:30 am"
date2="November 7th, 2006, 9:00 pm"

all i need is working hours between these dates...

first day & last days time makes complications here.
9e2504e0b74e5384af09ce8a660afac4?d=identicon&s=25 Pascal J. Bourguignon (Guest)
on 2008-12-10 14:40
(Received via mailing list)
Srikanth Jeeva <sri.jjhero@gmail.com> writes:

> want only the working hours(9am-5pm) between two dates, weekends should
> be omitted..
>
> i did this code..
> but i need the total hours between 9am-5pm, between the given dates..
> can any one plz help??

There's 8 hours between 9am-5pm, so 8 hour/working day.
There's 5 working day/week.

So if you can compute the number of weeks between the Monday following
the first date, and the Monday preceding the last date, you can easily
compute the number of working hours.

if week-of(start) = week-of(end) then
   working-hours = working-hours/working-day * working-days(from start
to end)
else
   working-hours = working-hours/working-day * ( working-days(from start
to end-of-week-after(start))
                                               + working-days(from
beginning-of-week-before(end) to end)
                                               +
working-days/working-weeks * working-weeks(from end-of-week-after(start)
                                                                                            to
beginning-of-week-before(end)))
end
9e2504e0b74e5384af09ce8a660afac4?d=identicon&s=25 Pascal J. Bourguignon (Guest)
on 2008-12-10 15:57
(Received via mailing list)
Srikanth Jeeva <sri.jjhero@gmail.com> writes:

>
> date1="March 5th, 2005, 5:30 am"
> date2="November 7th, 2006, 9:00 pm"
>
> all i need is working hours between these dates...
>
> first day & last days time makes complications here.

If you have partial days, apply the same principle than in my previous
answer, trim off the partial days, compute the trimmed off hours, and
multiply the days by the working-hours-per-day.

if day(start)=day(end) then
  min(5pm,hour(end)) - max(9am,hour(start))
else
  (min(5pm,hour(end)) - 9am)
  + (5pm - max(9am,hour(start)))
  + previous algo with (start + 1day) and (end - 1 day)
end
2e8848a777f7165f80da876ab1e6e7e5?d=identicon&s=25 dusty (Guest)
on 2008-12-10 17:11
(Received via mailing list)
On Dec 10, 8:32 am, Srikanth Jeeva <sri.jjh...@gmail.com> wrote:
>
> date1="March 5th, 2005, 5:30 am"
> date2="November 7th, 2006, 9:00 pm"
>
> all i need is working hours between these dates...
>
> first day & last days time makes complications here.
> --
> Posted viahttp://www.ruby-forum.com/.

You could try this beauty of a gem.

http://runt.rubyforge.org/

http://runt.rubyforge.org/doc/files/doc/tutorial_t...
This topic is locked and can not be replied to.