营业日期/假日处理

时间:2010-09-29 12:02:33

标签: ruby date

我发布了this question for C#但我可能正在使用Ruby。所以我问的是关于Ruby的同样问题:

我正在寻找一个类似于Perl模块Date::Manip的Ruby类/库/模块,就业务/假日日期而言。在Perl中使用该模块,我可以传递一个日期并查明它是一个工作日(即周一至周五)还是假日。在配置文件中定义假期非常简单(参见Date::Manip::Holidays)。您可以输入适用于每年的“固定”日期,例如:

12/25                           = Christmas
每年的

或'动态'日期,如:

last Monday in May              = Memorial Day
某一年的

或'固定'日期,如:

5/22/2010                       = Bob's Wedding

您还可以传递一个日期并返回下一个/上一个工作日(这不是周末而不是假期的任何一天)。

有没有人知道Ruby世界中有类似的东西?

4 个答案:

答案 0 :(得分:5)

您可以使用holidays-gem。 http://rubygems.org/gems/holidays

某些国家(和地区)假期已经预先定义,您可以定义自己的假期定义。

答案 1 :(得分:2)

business_time gem应该做你需要的。

自述文件底部的示例是一个很好的开始示例:

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)

您可能需要chronic gem来帮助您从配置文件中构建假日日期。但是YMMV因为您的示例上周一可能chronic中不起作用。 Hackaround就是这样的:

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

并查看chronic tickle,该gem {{3}}适用于添加定期事件的方法。

/ I3az /

答案 2 :(得分:0)

你可以看看我的Workpattern宝石。它允许您指定工作和休息时间。它旨在制作一个&#34;日历&#34;就像用于Microsoft Project和Primavera P6等规划工具一样,所以你可以指定一分钟。

这是一个简单的例子:

创建一个新的工作模式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/11@18:00

1920年是4天*每天8小时* 60分钟和小时。

我写了宝石学习Ruby - 只是划伤了表面。

答案 3 :(得分:0)

查看biz gem。

以下是配置示例:

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