年度・月締め・日締め

日本での商習慣等の概念として、年度や五十日による月締めの考え方があります。
また、日を跨ぐ深夜残業時間帯は前日分の業務として扱うといったような、本来の暦の年月日とは異なる表現が必要なケースが存在します。
このクラスではそういった、区切りとなる日や時間が通常の暦と異なるものを処理するために使用します。

FiscalYear クラスは、年度(1/1が年の開始日でないもの)を表すクラスです。
このクラスから得られる、FYD クラスの示す年は、カレンダー上の年ではなく、年度を示しています。

import ajd4jp.*;

public class Test {
    public static void main(String[] argv) throws AJDException {
        AJD test4 = new AJD(2011, 4, 1);
        AJD test10 = new AJD(2011, 10, 1);
        AJD test11 = new AJD(2011, 11, 1);
        // 会計年度。
        FiscalYear  kaikei = new FiscalYear();
        // 大豆年度。10月~。開始日を年とする。
        FiscalYear  daizu = new FiscalYear(test10, true);
        // 米穀年度。11月~。終了日を年とする。
        FiscalYear  kome = new FiscalYear(test11, false);

        System.out.println("会計年度");
        System.out.println(kaikei.getFYD(test4.addDay(-1)));
        System.out.println(kaikei.getFYD(test4 ) );
        System.out.println("大豆年度");
        System.out.println(daizu.getFYD(test10.addDay(-1)));
        System.out.println(daizu.getFYD(test10));
        System.out.println("米穀年度");
        System.out.println(kome.getFYD(test11.addDay(-1)));
        System.out.println(kome.getFYD(test11));
        System.out.println("");
        System.out.println("会計年度");
        System.out.println(kaikei.getFYD(2011, 2, 29));
        System.out.println(kaikei.getFYD(2012, 2, 29));
    }
}
出力例
会計年度
2010/03/31 00:00:00
2011/04/01 00:00:00
大豆年度
2010/09/30 00:00:00
2011/10/01 00:00:00
米穀年度
2011/10/31 00:00:00
2012/11/01 00:00:00

会計年度
2011/02/29 00:00:00
Exception in thread "main" ajd4jp.AJDException: 指定日が存在しません。
        at ajd4jp.FiscalYear.getFYD(FiscalYear.java:233)
        at ajd4jp.FiscalYear.getFYD(FiscalYear.java:164)
        at Year.main(Year.java:25)

最後の会計年度の例で指定している 2011 や 2012 は会計年度です。
西暦年2012年(閏年)の2/29は、会計年度では2011年です。
最後の呼び出し(2012/02/29)は平年であるため例外が発生します。

FiscalYear クラスは、年度と同様に、月や日の切り替わりも表現できます。
例えば毎月20日で締めて、翌月に21日~20日までの料金を請求する、といった業務で利用する場合、以下のようになります。

import ajd4jp.*;

public class Mon {
    private static FiscalYear   acc;

    public static void main( String[] argv ) throws AJDException {
        // 月締め設定。
        acc = new FiscalYear( new AJD( 2000, 1, 21 ), null, false, null );
        Month   mon = new Month( 2012, 12 );
        print( mon );
        print( mon.add( 1 ) );
    }

    private static void print( Month mon ) {
        System.out.println( mon );
        for ( AJD d: mon.getDays() ) {
            System.out.print( d.getDay() );
            FYD fyd = acc.getFYD( d );
            String  str = String.format( "日\t%d年%d月分請求", fyd.getYear(), fyd.getMonth() );
            System.out.println( str );
        }
        System.out.println();
    }
}
出力例
2012/12
1日     2012年12月分請求
2日     2012年12月分請求
3日     2012年12月分請求
4日     2012年12月分請求
5日     2012年12月分請求
6日     2012年12月分請求
7日     2012年12月分請求
8日     2012年12月分請求
9日     2012年12月分請求
10日    2012年12月分請求
11日    2012年12月分請求
12日    2012年12月分請求
13日    2012年12月分請求
14日    2012年12月分請求
15日    2012年12月分請求
16日    2012年12月分請求
17日    2012年12月分請求
18日    2012年12月分請求
19日    2012年12月分請求
20日    2012年12月分請求
21日    2013年1月分請求
22日    2013年1月分請求
23日    2013年1月分請求
24日    2013年1月分請求
25日    2013年1月分請求
26日    2013年1月分請求
27日    2013年1月分請求
28日    2013年1月分請求
29日    2013年1月分請求
30日    2013年1月分請求
31日    2013年1月分請求

2013/01
1日     2013年1月分請求
2日     2013年1月分請求
3日     2013年1月分請求
4日     2013年1月分請求
5日     2013年1月分請求
6日     2013年1月分請求
7日     2013年1月分請求
8日     2013年1月分請求
9日     2013年1月分請求
10日    2013年1月分請求
11日    2013年1月分請求
12日    2013年1月分請求
13日    2013年1月分請求
14日    2013年1月分請求
15日    2013年1月分請求
16日    2013年1月分請求
17日    2013年1月分請求
18日    2013年1月分請求
19日    2013年1月分請求
20日    2013年1月分請求
21日    2013年2月分請求
22日    2013年2月分請求
23日    2013年2月分請求
24日    2013年2月分請求
25日    2013年2月分請求
26日    2013年2月分請求
27日    2013年2月分請求
28日    2013年2月分請求
29日    2013年2月分請求
30日    2013年2月分請求
31日    2013年2月分請求

例として次のような勤務シフトの24時間体制業務があるとします。

  • 06:00 ~ 14:00 シフト
    12/1の6:00勤務は、12/1の給与として計上する。
  • 14:00 ~ 22:00 シフト
    12/1の14:00勤務は、12/1の給与として計上する。
    残業で12/2 00:00を過ぎた場合、それも12/1の給与として計上する。
  • 22:00 ~ 06:00 シフト
    12/1の22:00勤務は、12/2の給与として計上する。

このような計上日がいつであるか?の判定処理では以下のように使用します。

import ajd4jp.*;
import ajd4jp.format.*;

public class Day {
    public static void main(String[] argv) throws AJDException {
        FiscalYear  a = new FiscalYear(new AJD(2000, 1, 1, 6, 0, 0), null, null, true);
        FiscalYear  b = new FiscalYear(new AJD(2000, 1, 1, 14, 0, 0), null, null, true);
        FiscalYear  c = new FiscalYear(new AJD(2000, 1, 1, 22, 0, 0), null, null, false);
        AJD d = new AJD(2012, 12, 31, 0, 0, 0);
        for (int h = 0; h < 24 * 2; h++, d = d.addHour(1)) {
            System.out.print(Formats.TIMESTAMP.toString(d));
            System.out.print("\t" + a.getFYD(d));
            System.out.print("\t" + b.getFYD(d));
            System.out.print("\t" + c.getFYD(d));
            System.out.println();
        }
    }
}
出力例
2012/12/31 00:00:00     2012/12/30 00:00:00     2012/12/30 00:00:00     2012/12/31 00:00:00
2012/12/31 01:00:00     2012/12/30 01:00:00     2012/12/30 01:00:00     2012/12/31 01:00:00
2012/12/31 02:00:00     2012/12/30 02:00:00     2012/12/30 02:00:00     2012/12/31 02:00:00
2012/12/31 03:00:00     2012/12/30 03:00:00     2012/12/30 03:00:00     2012/12/31 03:00:00
2012/12/31 04:00:00     2012/12/30 04:00:00     2012/12/30 04:00:00     2012/12/31 04:00:00
2012/12/31 05:00:00     2012/12/30 05:00:00     2012/12/30 05:00:00     2012/12/31 05:00:00
2012/12/31 06:00:00     2012/12/31 06:00:00     2012/12/30 06:00:00     2012/12/31 06:00:00
2012/12/31 07:00:00     2012/12/31 07:00:00     2012/12/30 07:00:00     2012/12/31 07:00:00
2012/12/31 08:00:00     2012/12/31 08:00:00     2012/12/30 08:00:00     2012/12/31 08:00:00
2012/12/31 09:00:00     2012/12/31 09:00:00     2012/12/30 09:00:00     2012/12/31 09:00:00
2012/12/31 10:00:00     2012/12/31 10:00:00     2012/12/30 10:00:00     2012/12/31 10:00:00
2012/12/31 11:00:00     2012/12/31 11:00:00     2012/12/30 11:00:00     2012/12/31 11:00:00
2012/12/31 12:00:00     2012/12/31 12:00:00     2012/12/30 12:00:00     2012/12/31 12:00:00
2012/12/31 13:00:00     2012/12/31 13:00:00     2012/12/30 13:00:00     2012/12/31 13:00:00
2012/12/31 14:00:00     2012/12/31 14:00:00     2012/12/31 14:00:00     2012/12/31 14:00:00
2012/12/31 15:00:00     2012/12/31 15:00:00     2012/12/31 15:00:00     2012/12/31 15:00:00
2012/12/31 16:00:00     2012/12/31 16:00:00     2012/12/31 16:00:00     2012/12/31 16:00:00
2012/12/31 17:00:00     2012/12/31 17:00:00     2012/12/31 17:00:00     2012/12/31 17:00:00
2012/12/31 18:00:00     2012/12/31 18:00:00     2012/12/31 18:00:00     2012/12/31 18:00:00
2012/12/31 19:00:00     2012/12/31 19:00:00     2012/12/31 19:00:00     2012/12/31 19:00:00
2012/12/31 20:00:00     2012/12/31 20:00:00     2012/12/31 20:00:00     2012/12/31 20:00:00
2012/12/31 21:00:00     2012/12/31 21:00:00     2012/12/31 21:00:00     2012/12/31 21:00:00
2012/12/31 22:00:00     2012/12/31 22:00:00     2012/12/31 22:00:00     2013/01/01 22:00:00
2012/12/31 23:00:00     2012/12/31 23:00:00     2012/12/31 23:00:00     2013/01/01 23:00:00
2013/01/01 00:00:00     2012/12/31 00:00:00     2012/12/31 00:00:00     2013/01/01 00:00:00
2013/01/01 01:00:00     2012/12/31 01:00:00     2012/12/31 01:00:00     2013/01/01 01:00:00
2013/01/01 02:00:00     2012/12/31 02:00:00     2012/12/31 02:00:00     2013/01/01 02:00:00
2013/01/01 03:00:00     2012/12/31 03:00:00     2012/12/31 03:00:00     2013/01/01 03:00:00
2013/01/01 04:00:00     2012/12/31 04:00:00     2012/12/31 04:00:00     2013/01/01 04:00:00
2013/01/01 05:00:00     2012/12/31 05:00:00     2012/12/31 05:00:00     2013/01/01 05:00:00
2013/01/01 06:00:00     2013/01/01 06:00:00     2012/12/31 06:00:00     2013/01/01 06:00:00
2013/01/01 07:00:00     2013/01/01 07:00:00     2012/12/31 07:00:00     2013/01/01 07:00:00
2013/01/01 08:00:00     2013/01/01 08:00:00     2012/12/31 08:00:00     2013/01/01 08:00:00
2013/01/01 09:00:00     2013/01/01 09:00:00     2012/12/31 09:00:00     2013/01/01 09:00:00
2013/01/01 10:00:00     2013/01/01 10:00:00     2012/12/31 10:00:00     2013/01/01 10:00:00
2013/01/01 11:00:00     2013/01/01 11:00:00     2012/12/31 11:00:00     2013/01/01 11:00:00
2013/01/01 12:00:00     2013/01/01 12:00:00     2012/12/31 12:00:00     2013/01/01 12:00:00
2013/01/01 13:00:00     2013/01/01 13:00:00     2012/12/31 13:00:00     2013/01/01 13:00:00
2013/01/01 14:00:00     2013/01/01 14:00:00     2013/01/01 14:00:00     2013/01/01 14:00:00
2013/01/01 15:00:00     2013/01/01 15:00:00     2013/01/01 15:00:00     2013/01/01 15:00:00
2013/01/01 16:00:00     2013/01/01 16:00:00     2013/01/01 16:00:00     2013/01/01 16:00:00
2013/01/01 17:00:00     2013/01/01 17:00:00     2013/01/01 17:00:00     2013/01/01 17:00:00
2013/01/01 18:00:00     2013/01/01 18:00:00     2013/01/01 18:00:00     2013/01/01 18:00:00
2013/01/01 19:00:00     2013/01/01 19:00:00     2013/01/01 19:00:00     2013/01/01 19:00:00
2013/01/01 20:00:00     2013/01/01 20:00:00     2013/01/01 20:00:00     2013/01/01 20:00:00
2013/01/01 21:00:00     2013/01/01 21:00:00     2013/01/01 21:00:00     2013/01/01 21:00:00
2013/01/01 22:00:00     2013/01/01 22:00:00     2013/01/01 22:00:00     2013/01/02 22:00:00
2013/01/01 23:00:00     2013/01/01 23:00:00     2013/01/01 23:00:00     2013/01/02 23:00:00