2010-09-29 44 views
7

He publicado this question for C# pero puedo estar trabajando en Ruby en su lugar. Así que estoy haciendo la misma pregunta sobre Ruby:Fecha de negocios/manejo de vacaciones

Estoy buscando una clase/biblioteca/módulo de Ruby que funcione de manera similar al módulo Perl Date::Manip en lo que respecta a fechas de negocios/vacaciones. Utilizando ese módulo en Perl, puedo pasarle una fecha y averiguar si es un día hábil (es decir, de lunes a viernes) o unas vacaciones. Las vacaciones son muy simples de definir en un archivo de configuración (ver Date::Manip::Holidays). Puede introducir una fecha 'fija' que se aplica a todos los años, como:

12/25       = Christmas 

o fechas 'dinámicas' por cada año como:

last Monday in May    = Memorial Day 

o 'fijo' data de un año determinado como:

5/22/2010      = Bob's Wedding 

también se puede pasar en una fecha y volver al siguiente día hábil/anterior (que es cualquier día que no es un fin de semana y no un día de fiesta).

¿Alguien sabe de algo así en el mundo de Ruby?

Respuesta

2

El business_timegem debe hacer lo que necesita.

El ejemplo de la parte inferior del documento README es un buen ejemplo de partida:

require 'rubygems' 
require 'active_support' 
require 'business_time' 

# We can adjust the start and end time of our business hours 
BusinessTime::Config.beginning_of_workday = "8:30 am" 
BusinessTime::Config.end_of_workday = "5:30 pm" 

# and we can add holidays that don't count as business days 
# July 5 in 2010 is a monday that the U.S. takes off because 
# our independence day falls on that Sunday. 
three_day_weekend = Date.parse("July 5th, 2010") 
BusinessTime::Config.holidays << three_day_weekend 
friday_afternoon = Time.parse("July 2nd, 2010, 4:50 pm") 
tuesday_morning = 1.business_hour.after(friday_afternoon) 

Probablemente va a necesitar la chronicgem para ayudarle a construir las fechas de vacaciones a partir de su archivo de configuración. Sin embargo, YMMV porque su ejemplo el último lunes de mayo de no funciona en chronic. Hackaround es hacer algo como esto:

# last monday in May (2010) 
Chronic.parse('last monday', :now => Time.parse('2010-06-01')) 

Y mira el ticklegem que trabaja en la parte superior de chronic una manera de añadir eventos recurrentes.

/I3az/

5

Es posible utilizar la fiesta-joya. http://rubygems.org/gems/holidays

Algunas vacaciones nacionales (y regionales) ya están predefinidas, puede definir sus propias definiciones de vacaciones.

+0

me gustaría para almacenarlos en la base de datos, creo que esta gema se almacena en archivos yml. ¿Hay alguna otra sugerencia? –

0

Puedes echar un vistazo a mi gema Workpattern. Le permite especificar tiempos de trabajo y descanso. Su objetivo era producir un "Calendario" como el que se usa en las herramientas de planificación, como Microsoft Project y Primavera P6, para que pueda especificar hasta el último minuto.

Aquí está un ejemplo sencillo:

Crear un nuevo Workpattern mywp=Workpattern.new('My Workpattern',2011,10) Esto es por 10 años a partir de 2011, pero se puede hacer que sea más largo o más corto.

Dígale que quiere que los fines de semana descansen y que también quiera descansar durante la semana para que trabaje entre las 9 y las 12 de la mañana y entre la 1 y las 6 de la tarde.

mywp.resting(:days => :weekend) 
mywp.resting(:days =>:weekday, :from_time=>Workpattern.clock(0,0),:to_time=>Workpattern.clock(8,59)) 
mywp.resting(:days =>:weekday, :from_time=>Workpattern.clock(12,0),:to_time=>Workpattern.clock(12,59)) 
mywp.resting(:days =>:weekday, :from_time=>Workpattern.clock(18,0),:to_time=>Workpattern.clock(23,59)) 

Ahora acaba de calcular utilizando minutos

mydate=DateTime.civil(2011,9,1,9,0) 
result_date = mywp.calc(mydate,1920) # => 6/9/[email protected]:00 

1920 es de 4 días * 8 horas al día * 60 minutos y horas.

Escribí la gema para aprender Ruby, solo arañé la superficie.

0

Echa un vistazo a la gema biz.

Aquí hay un ejemplo de configuración:

require 'biz' 

Biz.configure do |config| 
    config.hours = { 
    mon: {'09:00' => '17:00'}, 
    tue: {'00:00' => '24:00'}, 
    wed: {'09:00' => '17:00'}, 
    thu: {'09:00' => '12:00', '13:00' => '17:00'}, 
    sat: {'10:00' => '14:00'} 
    } 

    config.holidays = [Date.new(2014, 1, 1), Date.new(2014, 12, 25)] 

    config.time_zone = 'America/Los_Angeles' 
end 

Al utilizar las extensiones del núcleo opcional, es tan fácil como lo siguiente para averiguar si una fecha es un día laborable:

require 'biz/core_ext' 

Date.new(2014, 12, 25).business_day? # => false 
Cuestiones relacionadas