30
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby/Railsで土日+祝日+α営業日計算

Posted at

この記事は

  • 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

終わりに

  • キングクリムゾン!
30
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?