Perl で n 営業日前後の計算

Posted by
ぴろり
Posted at
2016/03/08 00:53
Trackbacks
関連記事 (1)
Post Comment
コメントできます
Category
開発メモ カテゴリ
カバーイメージ

 Perl において、任意の日付から n 営業日後、または n 営業日前の日付を求める覚書き。単純に± n 日とするのでなく、土日や日本の祝祭日、祝祭日が日曜に掛かった場合の振替休日、更に会社や学校の創立記念日などの任意に設定された休日も考慮します。

このエントリーをはてなブックマークに追加  

#!/usr/bin/perl
use v5.10;
use Calendar;
use Calendar::Japanese::Holiday;

### 任意指定の休日 MM/DD/YYYY
my %special_holiday = map{ $_ => 1 } qw{
    12/29/2015
    12/30/2015
    12/31/2015
    01/04/2016
};

### $_[0] から $_[1] 営業日後(前)の日付を返す
sub dt2offset {
    my $datetime = shift;
    my $offset = int shift || 0;
    my $offset_dir = 0 < $offset ? +1 : -1;

    # 月末をまたぐ計算などが面倒なので Calendar モジュールを使う
    my( $y, $m, $d ) = $datetime =~ /(\d+)\D+(\d+)\D+(\d+)/;
    my $c = Calendar->new_from_Gregorian( $m, $d, $y );
    while( $offset ){
        $c += $offset_dir;
        # 土日はカウントしない
        next if $c->weekday == 0; # 日曜
        next if $c->weekday == 6; # 土曜
        # 日本の祝祭日はカウントしない(振替休日を考慮する→第4引数)
        next if isHoliday( $c->year, $c->month, $c->day, 1 );
        # 特別休日はカウントしない
        next if $special_holiday{$c};
        # オフセットを進める
        $offset -= $offset_dir;
    }
    $c->date_string( '%Y-%m-%d' );
}

# 年末年始で動作確認
say dt2offset( '2015-12-31', +3 ); # 2016-01-07
say dt2offset( '2016/01/04', -3 ); # 2015-12-24
# 成人の日前後(振替休日あり)で動作確認
say dt2offset( '2016-01-08', +3 ); # 2016-01-14
say dt2offset( '2016-01-13', -3 ); # 2016-01-07

メモ

  • 土日は単純に曜日で判定します
  • 日本の祝祭日の判定には、Calendar::Japanese::Holiday モジュールを使用します
  • 創立記念日など任意の休日を配列に設定しておきます
24 行目
月ごとの末日やうるう日の面倒な処理は、Calendar モジュールが良しなにやってくれるので、素直に±1日できます。
29 行目
Calendar::Japanese::Holiday::isHoliday で振替も考慮した祝祭日の判定。isHoliday 関数は、その日が祝祭日だった場合、その名前を返します。振替休日だった場合、振替と返します。
31 行目
Calendar のインスタンスをスカラ コンテクストで評価すると、MM/DD/YYYY 形式で日付を返すので、%special_holiday に特別休日の指定がないか調べています。
33 行目
これらの条件に当てはまらない場合にのみ、営業日のオフセットを進めます。
このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:Perl で日付 X から日付 Y まで何営業日あるかの計算

関連記事/トラックバック (全 1 件中、最新 5 件まで表示しています)

Open MagicVox.net のスクリーンショット
タイトル
Perl で日付 X から日付 Y まで何営業日あるかの計算
Trackbacked at
2016/08/04 12:24
from
Open MagicVox.net
概要
 Perl において、週末や祝祭日、振替休日を考慮して n 営業日前後の日付を...

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。