2010-09-29 11 views
7

Ich habe this question for C# gepostet, aber ich kann stattdessen in Ruby arbeiten. So stelle ich die gleiche Frage über Ruby:Geschäftsdatum/Urlaub Handhabung

Ich bin auf der Suche nach einem Ruby-Klasse/Bibliothek/Modul, die ähnlich wie das Perl-Modul Date::Manip so weit wie Geschäft/Urlaub Daten funktioniert. Mit diesem Modul in Perl kann ich ihm ein Datum geben und herausfinden, ob es ein Geschäftstag (dh Mo-Fr) oder ein Feiertag ist. Feiertage sind sehr einfach in einer Konfigurationsdatei zu definieren (siehe Date::Manip::Holidays). Sie können ein ‚festes‘ Datum eingeben, die wie jedes Jahr gilt:

12/25       = Christmas 

oder ‚dynamisch‘ Daten für jedes Jahr wie:

last Monday in May    = Memorial Day 

oder ‚fixed‘ Daten für ein bestimmtes Jahr wie:

5/22/2010      = Bob's Wedding 

können Sie auch ein Datum übergeben und den nächsten/vorherigen Geschäftstag zurück (was jeden Tag ist das kein Wochenende ist und kein Feiertag).

Kennt jemand so etwas in der Ruby-Welt?

Antwort

2

Die business_timegem sollte tun, was Sie brauchen.

Das Beispiel am unteren Rand der Readme-doc ist ein guter Ausgangs Beispiel:

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) 

Sie wahrscheinlich die chronicgem müssen gehen Sie die Urlaubsdaten aus Ihrer Konfigurationsdatei helfen zu bauen. Allerdings YMMV, weil Ihr Beispiel letzten Montag im Mai nicht funktioniert in chronic. Hackaround ist so etwas wie folgt aus:

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

und Blick auf die ticklegem, die für eine Art und Weise auf der chronic arbeitet wiederkehrende Ereignisse hinzuzufügen.

/I3az/

5

können Sie die Ferien-gem verwenden. http://rubygems.org/gems/holidays

Einige nationale (und regionale) Feiertage sind bereits vordefiniert, Sie können Ihre eigenen Urlaubsdefinitionen definieren.

+0

Ich möchte um sie in der Datenbank zu speichern, denke ich, dass dieses Juwel in YML-Dateien speichert. Gibt es einen anderen Vorschlag? –

0

Sie könnten einen Blick auf meine Workpattern Edelstein. Sie können Arbeits- und Ruhezeiten festlegen. Ziel war es, einen "Kalender" zu erstellen, wie er in Planungswerkzeugen wie Microsoft Project und Primavera P6 verwendet wird, so dass Sie genau auf die Minute festlegen können.

Hier ist ein einfaches Beispiel:

Erstellen Sie ein neues Workpattern mywp=Workpattern.new('My Workpattern',2011,10) Dieses seit 10 Jahren ab 2011, aber man kann es länger oder kürzer machen.

Sagen Sie, dass Sie möchten, dass die Wochenenden ausruhen und dass Sie auch unter der Woche ausruhen möchten, so dass Sie zwischen 9 und 12 Uhr morgens und 1 und 6 Uhr nachmittags arbeiten.

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)) 

Jetzt berechnen nur wenige Minuten mit

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

1920 beträgt 4 Tage * 8 Stunden pro Tag * 60 Minuten und Stunden.

Ich schrieb das Juwel Rubin zu lernen - nur die Oberfläche gekratzt.

0

Schauen Sie sich die biz gem.

Hier ist ein Beispiel-Konfiguration:

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 

Wenn Sie die optionalen Kern Erweiterungen verwenden, es ist so einfach wie das, um herauszufinden, folgende ob ein Datum ein Tagesgeschäft ist:

require 'biz/core_ext' 

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