Деловая дата / праздничная обработка - PullRequest
7 голосов
/ 29 сентября 2010

Я разместил этот вопрос для 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?

Ответы [ 4 ]

5 голосов
/ 16 сентября 2011

Вы можете использовать праздник-драгоценный камень.http://rubygems.org/gems/holidays

Некоторые национальные (и региональные) праздники уже предопределены, вы можете определить свои собственные определения праздников.

2 голосов
/ 29 сентября 2010

business_time гем должен делать то, что вам нужно.

Пример внизу документа README - хороший стартовый пример:

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

И посмотрите на tickle gem , который работает поверх chronic, чтобы найти способ добавить повторяющиесясобытия.

/ I3az /

0 голосов
/ 18 февраля 2015

Проверьте 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
0 голосов
/ 24 мая 2014

Вы можете взглянуть на мой Рабочий шаблон драгоценный камень. Позволяет указать время работы и отдыха. Он был нацелен на создание подобного «Календаря», используемого в инструментах планирования, таких как Microsoft Project и Primavera P6, так что вы можете указать его с точностью до минуты.

Вот простой пример:

Создайте новый Workpattern mywp=Workpattern.new('My Workpattern',2011,10) Это на 10 лет с 2011 года, но вы можете сделать его длиннее или короче.

Скажите, что вы хотите, чтобы в выходные дни отдыхали и что вы также хотите отдыхать в течение недели, чтобы вы работали с 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 - только поцарапал поверхность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...