この記事は
- Ruby/Railsで土日+祝日+α営業日計算をやる必要があったのでメモです
やりたかったこと
- 今日から10営業日前の日付だとかを取得したかったです
- 営業日の定義としては下記
- 土日以外
- 祝日以外
- 年末年始以外
- 12/29-1/3まで
やり方
- ありがたくライブラリを入れます
Gemfile
gem 'business_time'
gem 'holiday_jp'
- 結構試行錯誤しましたが、こんな感じで初期化をしました
config/initializers/business_date.rb
# 2000/1/1から翌年末までの営業日を範囲とする
start_date = Time.zone.parse('2000-01-01 00:00:00')
end_date = Time.zone.now.next_year.end_of_year
# 営業日計算ライブラリの営業時間を終日に指定
BusinessTime::Config.beginning_of_workday = "00:00:00 am"
BusinessTime::Config.end_of_workday = "11:59:59 pm"
# 営業日計算ライブラリへ日本の祝祭日情報を読み込み
HolidayJp.between(start_date, end_date).each{|h| BusinessTime::Config.holidays << h.date }
# 追加で独自の年末年始休暇を取り込み
# 12/29-1/3まではお正月休みとする
(start_date.year..end_date.year).each do |year|
BusinessTime::Config.holidays << Date.new(year, 1, 2)
BusinessTime::Config.holidays << Date.new(year, 1, 3)
BusinessTime::Config.holidays << Date.new(year, 12, 29)
BusinessTime::Config.holidays << Date.new(year, 12, 30)
BusinessTime::Config.holidays << Date.new(year, 12, 31)
end
やってること
- business_timeが営業日だけでなく営業時間まで見ている緻密な仕様なので、00:00:00-23:59:59までを営業時間と指定している
- holiday_jpの祝祭日情報をごっそりbusiness_timeに引き渡している
- 独自の年末年始休みを追加している
結果
- 1日ずつ遡っていったら、ゴールデンウィークで時が消し飛んでいてびっくりした
pry(main)> 18.business_days.ago.beginning_of_day
=> Tue, 07 May 2019 00:00:00 JST +09:00
pry(main)> 19.business_days.ago.beginning_of_day
=> Fri, 26 Apr 2019 00:00:00 JST +09:00
終わりに
- キングクリムゾン!