😽

Rails で business_time と holiday_jp を用いた営業日計算のコード例

2024/09/03に公開

1. はじめに

この記事では、以下の内容について学ぶことができます。

  • business_time gem と holiday_jp gem の設定方法
  • 営業日計算のさまざまなコード例

business_time gem
https://github.com/bokmann/business_time

holiday_jp gem
https://github.com/holiday-jp/holiday_jp-ruby

2. 営業日計算のコード例

2.1 gemの追加

まず、以下、必要なgemをGemfileに追加します。

Gemfile
gem 'business_time'
gem 'holiday_jp'

2.2 Initializer の設定

config/initializers/business_time.rb
ファイルを作成し、以下の設定します。

  • 現在の日付から3年前から翌年末までの範囲を動的に設定
  • 営業時間(10-20時)を指定
  • 日本の祝祭日情報を読み込み
config/initializers/business_time.rb
# 現在の日付から3年前から翌年末までの範囲を動的に設定
start_date = Time.current.beginning_of_year - 3.years
end_date = Time.current.next_year.end_of_year

# 営業日計算ライブラリの営業時間(10-20時)を指定
BusinessTime::Config.beginning_of_workday = '10:00:00 am'
BusinessTime::Config.end_of_workday = '08:00:00 pm'

# 営業日計算ライブラリへ日本の祝祭日情報を読み込み
HolidayJp.between(start_date, end_date).each { |h| BusinessTime::Config.holidays << h.date }

2.3 様々な営業日計算のコード例

class ExampleController < ApplicationController
  def index

    # 現在時刻から1営業時間後を計算
    @next_business_hour = 1.business_hour.from_now
    Rails.logger.debug "Next business hour: #{@next_business_hour}"

    # 現在日から1営業日後を計算
    @next_business_day = 1.business_day.from_now
    Rails.logger.debug "Next business day: #{@next_business_day}"

    # 現在から10営業日後の日付を計算
    @ten_business_days_later = 10.business_days.from_now
    Rails.logger.debug "10 business days later: #{@ten_business_days_later}"

    # 現在から1営業日前の日付を計算
    @one_business_day_before = 1.business_day.before(Time.current)
    Rails.logger.debug "1 business day before: #{@one_business_day_before}"

    # 現在から2営業時間前の時刻を計算
    @two_business_hours_before = 2.business_hours.before(Time.current)
    Rails.logger.debug "2 business hours before: #{@two_business_hours_before}"

    # 現在から1ヶ月後までの営業日数を計算
    @days_between = Time.current.business_days_until(1.month.from_now)
    Rails.logger.debug "Business days until next month: #{@days_between}"

    # 去年の営業日数を計算
    last_year_start = 1.year.ago.beginning_of_year
    last_year_end = 1.year.ago.end_of_year
    @business_days_last_year = last_year_start.business_days_until(last_year_end)
    Rails.logger.debug "Business days in last year: #{@business_days_last_year}"

    # 特定の日付(例:2024年4月1日)から3営業日前の日付を計算
    specific_date = Date.new(2024, 4, 1)
    @three_business_days_before = 3.business_days.before(specific_date)
    Rails.logger.debug "3 business days before #{specific_date}: #{@three_business_days_before}"

    # 次の営業日の開始時刻を計算
    @next_business_day_start = Time.current.next_business_day.beginning_of_workday
    Rails.logger.debug "Next business day start: #{@next_business_day_start}"

    # 2週間後の金曜日の終業時刻を計算
    @two_weeks_friday_end = 2.weeks.from_now.end_of_week(:friday).end_of_workday
    Rails.logger.debug "Two weeks Friday end of workday: #{@two_weeks_friday_end}"

    # 今月の最後の営業日を計算
    @last_business_day_of_month = Time.current.end_of_month.prev_business_day
    Rails.logger.debug "Last business day of this month: #{@last_business_day_of_month}"

    # 直前の営業日の終了時刻を計算
    @previous_business_day_end = Time.current.previous_business_day.end_of_workday
    Rails.logger.debug "Previous business day end: #{@previous_business_day_end}"

    # 次の営業時間の開始時刻を計算(現在が営業時間外の場合)
    @next_business_hour_start = Time.current.during_business_hours? ? Time.current : Time.current.next_business_hour
    Rails.logger.debug "Next business hour start: #{@next_business_hour_start}"

    # 現在から100営業時間後の日時を計算
    @hundred_business_hours_later = 100.business_hours.from_now
    Rails.logger.debug "100 business hours later: #{@hundred_business_hours_later}"

    # 現在時刻から24営業時間後が週末や祝日を跨ぐ場合の計算
    @twenty_four_business_hours_later = 24.business_hours.from_now
    Rails.logger.debug "24 business hours later: #{@twenty_four_business_hours_later}"

    # 現在の日時が営業時間内かどうかを判定
    @is_during_business_hours = Time.current.during_business_hours?
    Rails.logger.debug "Is during business hours: #{@is_during_business_hours}"

    # 特定の期間内の営業日のみの日付配列を生成
    start_date = Date.current
    end_date = 1.month.from_now.to_date
    @business_days_array = (start_date..end_date).select(&:workday?)
    Rails.logger.debug "Business days in the next month: #{@business_days_array.size} days"

    # 次の祝日を取得(holiday_jp gemの機能を使用)
    @next_holiday = HolidayJp.between(Date.current, 1.year.from_now).first
    Rails.logger.debug "Next holiday: #{@next_holiday&.date} (#{@next_holiday&.name})"

    # 営業時間(business hour)の例
    @one_business_hour_later = 1.business_hour.from_now
    @two_business_hours_later = 2.business_hours.from_now
    Rails.logger.debug "1 business hour later: #{@one_business_hour_later}"
    Rails.logger.debug "2 business hours later: #{@two_business_hours_later}"

    # 営業日(business day)の例
    @one_business_day_later = 1.business_day.from_now
    @five_business_days_later = 5.business_days.from_now
    Rails.logger.debug "1 business day later: #{@one_business_day_later}"
    Rails.logger.debug "5 business days later: #{@five_business_days_later}"

    # 営業週(business week)の例
    @one_business_week_later = 1.business_week.from_now
    @three_business_weeks_later = 3.business_weeks.from_now
    Rails.logger.debug "1 business week later: #{@one_business_week_later}"
    Rails.logger.debug "3 business weeks later: #{@three_business_weeks_later}"
  end
end

3. コード例の解説

3.1 基本的な営業日・時間計算

現在時刻から1営業時間後を計算

@next_business_hour = 1.business_hour.from_now
  • 現在の時刻から1営業時間後の日時を計算します
  • 休日や営業時間外の時間は考慮されます

現在日から1営業日後を計算

@next_business_day = 1.business_day.from_now
  • 現在の日付から1営業日後の日付を計算します
  • 休日は営業日としてカウントされません

現在から10営業日後の日付を計算

@ten_business_days_later = 10.business_days.from_now
  • 現在の日付から10営業日後の日付を計算します
  • 休日はスキップされます

現在から1営業日前の日付を計算

@one_business_day_before = 1.business_day.before(Time.current)
  • 現在の日付から1営業日前の日付を計算します
  • 休日は考慮され、スキップされます

現在から2営業時間前の時刻を計算

@two_business_hours_before = 2.business_hours.before(Time.current)
  • 現在の時刻から2営業時間前の時刻を計算します
  • 休日や営業時間外の時間は考慮されます

3.2 特定期間の営業日数計算

現在から1ヶ月後までの営業日数を計算

@days_between = Time.current.business_days_until(1.month.from_now)
  • 現在の日付から1ヶ月後までの営業日数を計算します
  • 休日は除外されます

去年の営業日数を計算

last_year_start = 1.year.ago.beginning_of_year
last_year_end = 1.year.ago.end_of_year
@business_days_last_year = last_year_start.business_days_until(last_year_end)
  • 去年の営業日数を計算します

3.3 特定の日付や時刻の計算

特定の日付から3営業日前の日付を計算

specific_date = Date.new(2024, 4, 1)
@three_business_days_before = 3.business_days.before(specific_date)
  • 指定された日付(この例では2024年4月1日)から3営業日前の日付を計算します。

次の営業日の開始時刻を計算

@next_business_day_start = Time.current.next_business_day.beginning_of_workday
  • 次の営業日の開始時刻を計算します

2週間後の金曜日の終業時刻を計算

@two_weeks_friday_end = 2.weeks.from_now.end_of_week(:friday).end_of_workday
  • 2週間後の金曜日の終業時刻を計算します

今月の最後の営業日を計算

@last_business_day_of_month = Time.current.end_of_month.prev_business_day
  • 今月の最後の営業日を計算します

直前の営業日の終了時刻を計算

@previous_business_day_end = Time.current.previous_business_day.end_of_workday
  • 現在の日付の直前の営業日の終了時刻を計算します
  • 現在日が営業日の場合、前営業日の終了時刻が返されます

次の営業時間の開始時刻を計算

@next_business_hour_start = Time.current.during_business_hours? ? Time.current : Time.current.next_business_hour
  • 次の営業時間の開始時刻を計算します
  • 現在が営業時間内の場合は現在時刻を営業時間外の場合は次の営業時間の開始時刻を返します

3.4 複合的な営業日・時間計算

現在から100営業時間後の日時を計算

@hundred_business_hours_later = 100.business_hours.from_now
  • 現在の日時から100営業時間後の日時を計算します

現在時刻から24営業時間後が週末や祝日を跨ぐ場合の計算

@twenty_four_business_hours_later = 24.business_hours.from_now
  • 現在の日時から24営業時間後の日時を計算します。週末や祝日を跨ぐ場合も適切に計算されます。

3.5 営業日・時間の判定と配列生成

現在の日時が営業時間内かどうかを判定

@is_during_business_hours = Time.current.during_business_hours?
  • 現在の日時が設定された営業時間内かどうかを判定します

特定の期間内の営業日のみの日付配列を生成

start_date = Date.current
end_date = 1.month.from_now.to_date
@business_days_array = (start_date..end_date).select(&:workday?)
  • 今日から1ヶ月後までの期間内の営業日のみの日付配列を生成します

3.6 祝日の取得

次の祝日を取得

@next_holiday = HolidayJp.between(Date.current, 1.year.from_now).first
  • holiday_jp gemを使用して、今日から1年以内の最初の祝日を取得します

3.7 単数形と複数形の使い分け

# 営業時間(business hour)の例
@one_business_hour_later = 1.business_hour.from_now
@two_business_hours_later = 2.business_hours.from_now

# 営業日(business day)の例
@one_business_day_later = 1.business_day.from_now
@five_business_days_later = 5.business_days.from_now

# 営業週(business week)の例
@one_business_week_later = 1.business_week.from_now
@three_business_weeks_later = 3.business_weeks.from_now
  • 計算する単位が1の場合は単数形(例:business_hourbusiness_daybusiness_week)を使用します
  • 2以上の場合は複数形(例:business_hoursbusiness_daysbusiness_weeks)を使用します

4. まとめ

この記事では、Railsアプリケーションにおいてbusiness_time gemとholiday_jp gemを使用して、日本の祝日と休日を考慮した営業日計算を行う方法を解説しました。

主要なポイントは以下の通りです。

  1. business_timeholiday_jp gemの適切な設定と初期化
  2. 動的な日付範囲での祝日と休日の設定
  3. business_time gemの様々なメソッドを使用した柔軟な営業日・時間計算

これらの知識を活用することで、より柔軟で正確な営業日計算機能をRailsアプリケーションに実装することができるでしょう。

以上、最後までお読みいただきありがとうございました。

この記事がお役に立ちましたら「いいね!」よろしくお願いします。

Discussion