日時書式化

ajd4jp.format パッケージは、日時を表す文字列生成のための書式化を行う機能となっています。

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

public class Test {
    public static void main(String[] argv) throws AJDException {
        AJD ajd = new AJD(1989, 1, 20, 14, 10, 0);
        System.out.println(Formats.DATE.toString(ajd));
        System.out.println(Formats.TIME.toString(ajd));
        System.out.println(Formats.TIMESTAMP.toString(ajd));
        System.out.println(Formats.YMD.toString(ajd));
        System.out.println(Formats.HMS.toString(ajd));
        System.out.println(Formats.YMDHMS.toString(ajd));
    }
}
出力例
1989/01/20
14:10:00
1989/01/20 14:10:00
19890120
141000
19890120141000

まず、このライブラリには上の6種類のフォーマットのみが準備されています。
日本国内の場合、この3種類があればほぼ必要十分ですが、公的文書の場合など、日付を漢数字表記にしなければならない場合等あります。
そのためアラビア数字の他、漢数字でもフォーマット可能なよう、出力形式をカスタマイズ可能としています。

以下、上記プリセット形式以外のフォーマットを作成したい場合の指定方法について説明します。
大きく、次の2種類のクラスで構成されています。 どちらも抽象クラスで、サブクラスが実際の処理を行います。 各サブクラスの組み合わせにより、任意の出力形式が得られます。

クラス名 機能
Numeral数値フォーマットを制御します。
このクラスは日時とは無関係に、単純に与えられた数値をどのような文字表現にするか制御します。
FormattoString(Day)形式のメソッドを持ち、入力された日時を文字列に変換して返す機能を持ちます。
このクラスが、何の項目(年や月など)をどの順番で、どのように出力するか(Numeralクラスをどのように使うか)制御します。
上の例の Formats.TIMESTAMP 等は、Format 派生クラスの実インスタンスです。

Numeral 具象クラス

以下のものは、Numeral の一次派生クラスです。
桁数無制限の数値を扱いますが、西暦年のフォーマットにしか使用できません。

クラス名 機能 出力例
HalfArabia半角アラビア数字(0123456789)で表現します。1989
FullArabia全角アラビア数字(0123456789)で表現します。1989
Japan漢数字(〇一二三四五六七八九)で表現します。一九八九

Two 具象クラス

Numeral の一次派生クラスに、Two クラスがあります。これも抽象クラスです。
Two クラスは西暦年以外の項目のフォーマットに使用し、2桁の正数値を扱います。
以下のものが、Two クラスの派生クラスです。

クラス名 機能 出力例
TwoHalfArabia半角アラビア数字(0123456789)で表現します。01
TwoFullArabia全角アラビア数字(0123456789)で表現します。01
TwoJapan漢数字(〇一二三四五六七八九)で表現します。〇一

上記3クラスとも、コンストラクタで以下の指定が可能です。

  • 数値が1桁だった場合、数値の手前に補う文字。
    これにより、"1"を、"01"としたり" 1"としたりできます。
    文字を補わず、1桁のまま出力することも可能です。
  • 漢字のルール(Two.Rule)。
    "10"を、"一〇"とするか"十"とするか等の指定が可能です。
    このルール適用後の1桁の文字は、上の文字補完が効きません。そのまま1文字で表示されます。

enum Two.Rule 一覧

漢字のルールは以下のものがあります。これらを複数指定可能で、競合するルールは、先に指定したものが有効となります。

enum値 機能 未指定時の例 指定時の例
ZERO"0"を"零"にします。〇時零時
FIRST"1"を"元"にします。一年元年
TENTH"10"を"十"にします。一〇月十月
TWENTIETH"20"を"廿"にします。二〇日廿日
THIRTIETH"30"を"卅"にします。三〇日卅日
MULTIPLE_TEN10で割り切れる場合、"0"を"十"にします。
TENTHも指定されたものとみなされます。
三〇日三十日
TENS10~19の場合、"1"を"十"にします。
TENTHも指定されたものとみなされます。
一一日十一日
TWENTIES20~29の場合、"2"を"廿"にします。
TWENTIETHも指定されたものとみなされます。
二二日廿二日
THIRTIES30~39の場合、"3"を"卅"にします。
THIRTIETHも指定されたものとみなされます。
三一日卅一日
TRIPLE21以上の場合、三文字表現とします。
MULTIPLE_TEN、TENSおよびTENTHも指定されたものとみなされます。
三一日三十一日

Format 具象クラス

各日時項目出力を指示するクラスが以下となります。

項目 クラス名 出力例 機能
GregorianYearF1989
AD1989
紀元前1000
西暦年を表します。また、紀元前・紀元後を表す文字列を指定できます。
このクラスからの出力はマイナス値はありません。例えば、-1000ならばBC1000のようになります。
このクラス以外は、Two派生クラスしか指定できません。
JapaneseYearF令和1
R1
R1
和暦の年を表します。明治より前が指定された場合、正しく表示されません。
元号表記は、以下の3パターンから選べます。
・漢字をそのまま出力。
・半角英字1文字。
・全角英字1文字。
MonthF1
Jan
January
睦月
月を表します。
表示対象がLSCD(旧暦)クラスの場合、閏月であれば"閏"の文字を追加します。
数値表記以外に、以下の名称表示も可能です。
・英語名略称。
・英語名。
・日本語名。
DayF1日を表します。
WeekFSun
Sunday
曜日を表します。曜日表記は以下の名称表示が可能です。
・英語名略称。
・英語名。
・日本語名。
HourF13
PM1
時を表します。24時間制、12時間制が選べます。
12時間制の場合、手前に付与する文字列が指定できます。
MinuteF1分を表します。
SecondF1秒を表します。

以下は、日時要素ではない、Format派生クラスです。

クラス名 機能
C固定文字列です。上表の間に挟む文字列を指定します。
例えば、"/"や":"、"時"などの文字列です。
Formatsこれまでに登場した、Format 派生クラスを格納するコンテナです。
このクラスに指定した順序で、各日時項目が出力されます。

以下は例として、FormatsクラスのDATE、TIME、TIMESTAMPのソース中での実際の宣言部です。

/**
 * YYYY/MM/DD フォーマット。
 */
public static final Formats DATE = new Formats(
  new GregorianYearF(), new C("/"),
  new MonthF(), new C("/"),
  new DayF()
);

/**
 * HH:MM:SS 24時間制フォーマット。
 */
public static final Formats TIME = new Formats(
  new HourF(), new C(":"),
  new MinuteF(), new C(":"),
  new SecondF()
);

/**
 * YYYY/MM/DD HH:MM:SS 24時間制フォーマット。
 */
public static final Formats TIMESTAMP = new Formats(
  DATE, new C(" "), TIME
);

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

public class Test {
    private static Formats format = new Formats(
        new JapaneseYearF(
            new TwoJapan(
                Two.Rule.FIRST,     // 1を元と表記する。
                Two.Rule.TRIPLE     // 21以上の場合、三文字で表記する。
            )
        ),
        new C("年"),
        new MonthF(new TwoJapan()),
        new C("月"),
        new DayF(
            new TwoJapan(
                Two.Rule.TENS,      // 10~19の場合、1ではなく十で表記する。
                Two.Rule.TWENTIES,  // 20~29の場合、2ではなく廿で表記する。
                Two.Rule.THIRTIES   // 31~39の場合、3ではなく卅で表記する。
            )
        ),
        new C("日 "),
        new WeekF(),
        new C("曜日  "),
        new HourF("午前", "午後",
            new TwoJapan(
                Two.Rule.ZERO   // 0を零と表記する。
            )
        ),
        new C("時"),
        new MinuteF(new TwoJapan(' ')),
        new C( "分" ),
        new SecondF(new TwoJapan('〇')),
        new C("秒")
    );

    public static void main(String[] argv) throws AJDException{
        AJD s = new AJD(1988, 12, 31, 0, 1, 5);
        AJD h = new AJD(1989, 1, 20, 14, 10, 0);
        System.out.println(format.toString(s));
        System.out.println(format.toString(h));
    }
}
出力例
昭和六十三年一二月卅一日 土曜日  午前零時 一分〇五秒
平成元年一月廿日 金曜日  午後二時一〇分〇〇秒