2010-09-29 35 views
7

Tôi đã đăng this question for C# nhưng thay vào đó tôi có thể đang làm việc trong Ruby. Vì vậy, tôi hỏi cùng một câu hỏi về Ruby:Ngày làm việc/xử lý ngày lễ

Tôi đang tìm một lớp/thư viện/mô-đun Ruby hoạt động tương tự như mô-đun Perl Date::Manip cho đến ngày làm việc/ngày lễ. Sử dụng mô-đun đó trong Perl, tôi có thể vượt qua nó một ngày và tìm hiểu xem đó là một ngày làm việc (ví dụ, Mon-Fri) hoặc một kỳ nghỉ. Ngày lễ rất đơn giản để xác định trong tệp cấu hình (xem Date::Manip::Holidays). Bạn có thể nhập một ngày 'cố định' áp dụng cho mỗi năm như:

12/25       = Christmas 

hoặc ngày 'năng động' cho mỗi năm như:

last Monday in May    = Memorial Day 

hoặc 'cố định' ngày cho một năm nhất định như:

5/22/2010      = Bob's Wedding 

Bạn cũng có thể chuyển vào ngày và quay lại ngày làm việc tiếp theo/trước đó (ngày bất kỳ không phải là ngày cuối tuần và không phải ngày lễ).

Có ai biết điều gì giống như thế trong thế giới Ruby không?

Trả lời

2

business_timegem nên làm những gì bạn cần.

Ví dụ ở dưới cùng của doc README là một ví dụ bắt đầu tốt:

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) 

Bạn có thể sẽ cần chronicgem để giúp bạn xây dựng các ngày nghỉ lễ từ tập tin cấu hình của bạn. Tuy nhiên YMMV vì ví dụ của bạn thứ hai cuối cùng trong tháng không hoạt động ở chronic. Hackaround là làm một cái gì đó như thế này:

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

Và nhìn vào ticklegem mà hoạt động trên đỉnh chronic kiếm một cách để thêm các sự kiện định kỳ.

/I3az/

5

Bạn có thể sử dụng ngày lễ-đá quý. http://rubygems.org/gems/holidays

Một số ngày lễ quốc gia (và khu vực) đã được xác định trước, bạn có thể xác định định nghĩa ngày lễ của riêng mình.

+0

Tôi muốn để lưu trữ chúng trong cơ sở dữ liệu, tôi nghĩ đá quý này lưu trữ trong các tệp yml. Có đề xuất nào khác không? –

0

Bạn có thể xem đá quý Workpattern của mình. Nó cho phép bạn chỉ định thời gian làm việc và nghỉ ngơi. Nó nhằm mục đích tạo ra một "Calendar" giống như được sử dụng trong các công cụ lập kế hoạch như Microsoft Project và Primavera P6, vì vậy bạn có thể chỉ định ngay xuống từng phút.

Dưới đây là một ví dụ đơn giản:

Tạo một Workpattern mới mywp=Workpattern.new('My Workpattern',2011,10) Đây là trong 10 năm từ năm 2011 nhưng bạn có thể làm cho nó dài hơn hoặc ngắn hơn.

Cho bạn biết bạn muốn nghỉ ngơi vào cuối tuần và bạn cũng muốn nghỉ ngơi trong tuần để bạn làm việc từ 9 đến 12 giờ sáng và 1 và 6 vào buổi chiều.

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

Bây giờ chỉ cần tính toán sử dụng phút

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

1920 là 4 ngày * 8 giờ một ngày * 60 phút và giờ.

Tôi đã viết đá quý để tìm hiểu Ruby - chỉ trầy xước bề mặt.

0

Kiểm tra đá quý biz.

Dưới đây là một cấu hình ví dụ:

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 

Khi bạn sử dụng các phần mở rộng cốt lõi tùy chọn, đó là dễ dàng như sau để tìm hiểu xem một ngày là một ngày làm việc:

require 'biz/core_ext' 

Date.new(2014, 12, 25).business_day? # => false 
Các vấn đề liên quan