2010-09-29 75 views
7

我已經發布this question for C#,但我可能是在Ruby中工作。所以我問的是關於Ruby的同一個問題:營業日期/假日處理

我正在尋找一個Ruby類/庫/模塊,其工作方式與Perl模塊Date::Manip一樣遠至商務/假期日期。在Perl中使用該模塊,我可以將它傳遞給一個日期,並確定它是營業日(即週一至週五)還是假期。在配置文件中定義假期非常簡單(請參閱Date::Manip::Holidays)。您可以輸入適用於每年像一個「固定」日期:

12/25       = Christmas 

或「動態」日期每年都一樣:

last Monday in May    = Memorial Day 

或「固定」的日期爲某一年,如:

5/22/2010      = Bob's Wedding 

您也可以通過在日期並取回一個/下一個營業日(這是任何一天,這不是一個週末不放假)。

有沒有人知道類似Ruby世界中的任何東西?

回答

2

business_timegem應該做你需要的。

在自述文檔的底部的例子是一個很好的起點例如:

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) 

你可能會需要的chronicgem幫助您建立從您的配置文件中的節日日期。但是YMMV因爲你的例子上個星期一可能在上不起作用chronic。 Hackaround是做這樣的事情:

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

,並期待在ticklegem這對chronic頂工程的方式來添加重複事件。

/I3az/

5

您可以使用假期寶石。 http://rubygems.org/gems/holidays

某些國家(和地區)假期已經預定義,您可以定義自己的假期定義。

+0

我想將它們存儲在數據庫中,我認爲這個寶石存儲在yml文件中。還有其他建議嗎? – 2017-01-16 07:24:35

0

你可以看看我的Workpattern寶石。它可以讓你指定工作和休息時間。它的目的是製作一個「日曆」,就像在Microsoft Project和Primavera P6等規劃工具中使用的一樣,所以您可以指定一切。

下面是一個簡單的例子:

創建一個新的Workpattern mywp=Workpattern.new('My Workpattern',2011,10)這是從2011年10月年,但你可以把它或長或短。

告訴它你希望週末休息,並且你也希望在一週內休息,所以你早上9點到12點,下午1點和6點工作。

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

現在纔算使用分鐘

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

1920爲4天*每天* 60分鐘和小時8小時。

我寫了寶石學紅寶石 - 只是表面上的劃痕。

0

退房biz寶石。

下面是一個例子配置:

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 

當您使用可選的核心擴展,這是因爲下面來看看一個日期是一個工作日一樣容易:

require 'biz/core_ext' 

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