はじめに
DateクラスやCalendarクラスを使用すると、特定の日付と時刻に関するプログラムについて操作することができます。
java.utilパッケージ内には、コレクションの他に日付操作クラスなどのクラスもあります。
現場では、プログラムの処理中の「値」だけではなく「時間」も大切な情報として記録することがほとんどなので、しっかり身につけましょう!
※Wiki内で基準となる日付は2020/1のものとなります
Step1: Dateクラス
Dateクラスは、日付を管理しているクラスです。
簡単に現在の日付と時刻を取得することができるクラスです。
ただし日付の計算などを行う場合には適していないクラスです。
例題
以下の通りコーディングし、 Dateクラスのインスタンスを生成後、コンソールへ出力しなさい。
【実行結果】
補足
・タイムゾーン
出力内容のJST のことで、 日本標準時刻が世界標準+9時間であることを示しています。
世界標準時刻はGMT(グリニッジ標準時)と呼ばれ、そのGMT を基準として日本であればJST、アメリカであればPST のように表記し「GMT±n時間の差」 があることを明示的に示します。
上記 GMT に微調整を加えた、 UTC(協定世界時)というものもありますが、今は時刻の基準があるんだなーという認識で問題ありません。(現場に出て、こういった時刻を扱うことが出てきたら「タイムゾーン」、「GMT」、「UTC」などについて詳しく調べてみるといいでしょう! )
Step2: Calendar クラス
Calendarクラスは、日時の計算などを行う場合に使用します。
例えば、「今日から1ヶ月と2週間後(45日後)」というような少しややこしい日付の計算をしなければいけない時にこのCalendarクラスが活躍してくれます。
Step1 に書いてある Dateクラスとは、ここが違うポイントになりますね。
例題
以下の通りコーディングし、カレンダークラスのgetTime()メソッドを実行しなさい。
【実行結果】
new Date の際の出力内容と同じフォーマットの結果値が得られます。
Calendarクラスに用意されている 「主要フィールド」一覧
例題
それでは、どのようにすれば日付の計算ができるのか、下記に示すCalendarクラスのサンプルプログラムを作成して実行してみましょう。
【実行結果】
カレンダークラスで定義されているCalendar.MONTHは基本的にJANUARY (実値=0)~ DECEMBER(実値=11) まで定義が存在し、実際の月の値は-1の値を保持しているため、上記では +1 することで実際に表示される月の値を調整しています。
しかし、以下の場合は注意が必要です。
上記サンプルコードから9ヶ月が経過した日付を表示するにプログラムと実行結果
【実行結果】
補足
- UNDECEMBER
Calendarクラスの Calendar.MONTH には UNDECEMBER(実値=12)というものが存在します。
これは私たちが使う「グレゴリオ暦(1~12月)」とは違い、「太陰太陽暦(1〜13月)」の場合に取得される値です。
一般的にプログラムを組んでいる場合は、このUNDECEMBERは取得されることはありません。 - うるう年
上記は正しい書き方にはなりますが、例外もあります。
それが「うるう年」の場合です。
【条件】
- 西暦年号が4で割り切れる年
- ただし西暦年号が100で割り切れて400で割り切れない年は平年(100で割り切れない場合、100で割り切れても400で割れる場合はうるう年)
カレンダーの設定が合っているのにもかかわらず想定している日付とならない場合は、うるう年のチェックをしてみるといいでしょう!
Step3: Timeクラス
このクラスはDateクラスとCalendar クラスの両方の特徴があり、データ保持と日付操作がTimeクラス1つで行うことができます。
Timeクラスには、LocalDateとLocaltimeのインスタンスを持つLocalDateTime、LocalDateTime に加え オフセット(標準時との時差) を含むOffsetDateTime,OffsetDateTimeに加えタイムゾーンを含むZonedDateTimeがあります。
例
【実行結果】
TimeクラスはDateクラスやCalendar クラスと異なり、 直接値を変更することはできません。
日時などの値を変更する場合は、インスタンスを生成しなおす必要があります。
また、月の値の対応もCalendar クラスと異なっており、月が1の場合そのまま1月として出力されます。
【実行結果】
補足
isLeap () メソッド
前述でうるうどしの説明がありましたが、Timeクラスには Year クラスというものが存在し、その Year クラスではうるう年を判定する staticメソッドが用意されています。
【サンプル: うるう年判定】
【出力結果】
とても簡単に使用できますね。
ロジックを考えることって大切ですが、開発者に優しいJava標準のAPIが実装されているならばそれを使わない手はありません!
課題
Java中級からはEclipseでの課題対応となります。
2-11フォルダの中にプロジェクトがありますので、インポートして以下の画像の通りに出力されるようにコーディングしなさい。
注意点
本課題に関しては、 実施日によりコンソールへ出力される値が変わるため添付画像はあくまで参考となります。
また、実行時の年がうるう年の場合においては、コードが正しいのにもかかわらず出力内容の日付にズレが生じる場合があります。
