クレジットカードは毎月、指定された日に引き落とされる仕組みですが、その日が休日の場合は、翌営業日に引き落とされるのが一般的です。
逆に給料は特殊な契約でなければ、毎月指定された日に振り込まれる仕組みですが、その日が休日の場合は、前営業日に振り込まれることが多いでしょう。
上記のような、特定の日に○○して欲しい、ただしその日が休みなら前後にずらすという処理を今回はholiday_japanというgemを使って実装します。
holiday_japanとは
1948年7月20日以降の日付に関して、日本の祝日かどうかを判定することができるgemです。
非常にコンパクトで、執筆時点(2025/04/01)で最新版はコア部分のrubyファイルが232行しかありません。
checkという関数にDate型の変数を渡すと、祝日かどうかをtrue/falseで教えてくれます。
HolidayJapan.check(Date.new(2023, 7, 17)) # この日は海の日
=> true
今回実装するもの
- 今回は例としてクレジットカードの引き落とし日を教えてくれる処理を実装します
- 年、月、通常の引き落とし日を渡すと、
x年y月の引き落とし日はx年y月z日です
と出力する
- 年、月、通常の引き落とし日を渡すと、
- クレジットカードの引き落としは原則毎月同じ日に行うが、土日もしくは祝日の場合翌営業日に引き落とすこととする
処理を実装する
- 処理としては非常に簡単で、土日もしくは祝日なら翌日にずらして判定するだけ
- 土日に関してはDate型に存在する
saturday?
メソッドとsunday?
メソッドで判定 - 祝日は先述の
HolidayJapan.check
を利用
- 土日に関してはDate型に存在する
require 'holiday_japan'
year = ARGV[0].to_i
month = ARGV[1].to_i
payment_day = ARGV[2].to_i
payment_date = Date.new(year, month, payment_day)
while payment_date.saturday? || payment_date.sunday? || HolidayJapan.check(payment_date)
payment_date += 1
end
puts "#{year}年#{month}月の引き落とし日は#{payment_date.strftime('%Y月%m日%d日')}です"
実際に試してみる
- 15日が引き落としの場合の2025年5月
- 2025年5月15日は平日なので、予定通り引き落とされる
❯ ruby credit_card_payment_day.rb 2025 5 15
2025年5月の引き落とし日は2025月05日15日です
- 15日が引き落としの場合の2023年7月
- 17日が海の日なので、土日と祝日で3日ずれて18日になる
❯ ruby credit_card_payment_day.rb 2023 7 15
2023年7月の引き落とし日は2023月07日18日です
- 27日が引き落としの場合の2019年4月
- 5/1日が新天皇即位日(2019年のみの祝日)で、更に祝日と祝日に挟まれた日は休日になるという法律により、4/30と5/2も休日になる
- その結果4/27から5/6まで休日なので5/7が引き落とし日になる
❯ ruby credit_card_payment_day.rb 2019 4 27
2019年4月の引き落とし日は2019月05日07日です
問題なく、特定日に処理を実行するが、休日であれば翌営業日にずらす処理が実装できていそうです。
まとめ
今回月初にある処理をさせたいが、休日もしくは祝日なら後にずらす処理を趣味で組むタイミングがあり、今回の記事を書きました。
他の言語でも祝日に関するライブラリは存在するので、今回の記事のような処理が必要になったときは是非探して利用してみてください。