java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

Calendarで午前午後を取得

投稿日:

最終更新日:2016年07月10日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

前回はCalendarのインスタンスと引数なしgetXXXメソッドについて書きました。今回はint get(int field)メソッドについて書きます。引数はカレンダー・フィールドと呼ばれる定数を指定します。そのうちのCalendar.AM_PMを使ってみました。

Calendar.AM_PM

Calendar.AM_PMをgetメソッドの引数に指定すると、正午より前かどうかがint型で返却されるようです。API仕様書を見ると、以下の値が用意されていることが分かりました。

定義 内容
AM 深夜零時から正午の前までの時間を示す
PM 正午から深夜零時の前までの時間を示す

上記を確認するため、switch文を使った単純なメソッドを作り、実験しました。メソッドは以下の動きです。

定義
public static String judge(int key)
フロー
  1. String型変数sを空文字で初期化する。
  2. 仮引数keyに従い、sに以下の文字を格納する。
    条件 文字列
    Calendar.AM “AMです。”
    Calendar.PM “PMです。”
    上記以外 “範囲外です。”
  3. sを返却する。

ソースと実行結果

以下はソースと実行結果です。

ソースコード

package calendarTest;

import java.util.Calendar;

public class HelloGetAmPm {

    public static void main(String[] args) {

        Calendar c = Calendar.getInstance();
        c.clear();

        c.setTimeInMillis(1000L * 60L * 60L * 3L - 1L);
        System.out.println(c.getTime());
        System.out.println(judge((c.get(Calendar.AM_PM))));

        System.out.println();

        c.setTimeInMillis(1000L * 60L * 60L * 3L);
        System.out.println(c.getTime());
        System.out.println(judge((c.get(Calendar.AM_PM))));

        System.out.println();

        c.setTimeInMillis(1000L * 60L * 60L * 15L -1L);
        System.out.println(c.getTime());
        System.out.println(judge((c.get(Calendar.AM_PM))));

        System.out.println();

        c.setTimeInMillis(1000L * 60L * 60L * 15L);
        System.out.println(c.getTime());
        System.out.println(judge((c.get(Calendar.AM_PM))));
    }

    public static String judge(int key) {

        String s = "";

        switch (key) {
        case Calendar.AM:
            s = "AMです。";
            break;

        case Calendar.PM:
            s = "PMです。";
            break;
        default:
            s = "範囲外です。";
            break;
        }

        return s;
    }

}

結果

Thu Jan 01 11:59:59 JST 1970
AMです。

Thu Jan 01 12:00:00 JST 1970
PMです。

Thu Jan 01 23:59:59 JST 1970
PMです。

Fri Jan 02 00:00:00 JST 1970
AMです。

解説

clear()メソッドを使って初期化し、setTimeInMillisで時間を設定しています。setTimeInMillisの引数はlong型です。long型の数値リテラルを使うため、数字の末尾にLを使ってます。

1970年1月1日で実験です。

setTimeの引数を1000L * 60L * 60L * 3L – 1Lに指定したら11:59:59になりました。9:00:00スタートらしいです。タイムゾーンがAsia/Tokyoであるからだと思います。引数を1000L * 60L * 60L * 3Lにした場合、ちょうど正午です。それぞれの設定でswitch文から期待通りの文字列が格納されました。日付が変わった「Fri Jan 02 00:00:00 JST 1970」ではAMに戻りました。