我发布了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世界中有类似的东西?
答案 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