0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[小ネタ]毎月指定の日に特定処理を実行するが休日なら前後の営業日にずらす、というフローをholiday_japanを使って実装する

Posted at

クレジットカードは毎月、指定された日に引き落とされる仕組みですが、その日が休日の場合は、翌営業日に引き落とされるのが一般的です。
逆に給料は特殊な契約でなければ、毎月指定された日に振り込まれる仕組みですが、その日が休日の場合は、前営業日に振り込まれることが多いでしょう。

上記のような、特定の日に○○して欲しい、ただしその日が休みなら前後にずらすという処理を今回は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を利用
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日です
❯ ruby credit_card_payment_day.rb 2019 4 27
2019年4月の引き落とし日は2019月05日07日です

問題なく、特定日に処理を実行するが、休日であれば翌営業日にずらす処理が実装できていそうです。

まとめ

今回月初にある処理をさせたいが、休日もしくは祝日なら後にずらす処理を趣味で組むタイミングがあり、今回の記事を書きました。
他の言語でも祝日に関するライブラリは存在するので、今回の記事のような処理が必要になったときは是非探して利用してみてください。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?