2010-09-29 44 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