【Java入門】Calendarクラスで日付を操作する方法（getメソッド,setメソッド,addメソッド,rollメソッド)

# Calendarクラス

### ・Calendarクラスとは
　現在の年月日を取得したり、指定した日時の設定や加算・減算、日時を比較するなど、日時を扱うさまざまな処理が可能なクラスです。
　使用するには以下のパッケージを取得する必要があります。

```java:パッケージのインポート
import java.util.Calendar
```
　
　また生成の方法は、抽象クラスのためnew演算子でオブジェクト生成はできず、`getInstance()`メソッドを使用して生成します。
```java:Calendarクラスの生成
Calendar cl = Calendar.getInstance();
```
　getInstanceメソッドは、オブジェクトを生成する度に、現在の年・月・日に初期化された状態でオブジェクトを返します。getInstance()は、クラスメソッドでコンピューターの設定に合わせて適切なカレンダーを取得します。（大体はグレゴリオ暦なのでGregorianCalendarのインスタンスが入ります。）

### ・get()メソッドで日付を取得する
　ここでは`get()`メソッドを使って日付を取得する方法を説明します。
以下のサンプルコードのように`getTime()`メソッドと`get()`メソッドを使うことで日付の要素を取得することができます。
```java:日付を取得する二つの方法
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {
		
		// Calendarクラスの生成
		Calendar cl = Calendar.getInstance();
		
		// 現在日時の出力
		System.out.println("現在日時：" + cl.getTime());
        // getメソッドで年・月・日・時間を出力
		System.out.println("年：" + cl.get(Calendar.YEAR));
		System.out.println("月：" + (cl.get(Calendar.MONTH) + 1));
		System.out.println("日：" + cl.get(Calendar.DATE));
		System.out.println("時間：" + cl.get(Calendar.HOUR));

	}
}
```
```:実行結果
日付：Sat Sep 30 22:21:56 JST 2023
年：2023
月：9
日：30
時間：10
```
　`getTime()`メソッドでは、Dateオブジェクトを返すため、Calendarクラス生成時に初期化された日時が取得できます。`get()`メソッドでは、指定されたCalendarのフィールドの値を返します。サンプルコードでは、年・月・日・時間をそれぞれ取得しています。フィールドは他にいくつかあります。

※月に関しては、「0」から始まるので0が１月になります。そのため出力する時は、誤認をなくすために＋１をしています。

#### ・フィールド一覧

|フィールド| 説明 |
|:-:|:-:|
|YEAR|年|
|MONTH|月|
|DATE|日| 
|HOUR|時間（12時間）|
|MINUTE|分|
|SECOND|秒|
|HOUR_OF_DAY|時間（24時間）|
|AM_PM|午前なら「０」、午後なら「１」を返す|

### ・set()メソッド日付を設定する
　ここでは`set()`メソッドを使って日付を設定する方法を説明します。
`set()`メソッドは、第一引数にフィールド、第二引数に設定する値を指定することで、要素を設定することができます。
```java:
public void set(int field, int value)
```
　以下のサンプルコードのように`set()`メソッドを使うことで「年」を変更できます。第一引数は、Calendarクラスのフィールドを指定することで設定する要素を選ぶことができます。

```java:set()メソッドで年の設定
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {
		
		// Calendarクラスの生成と現在日時の出力
		Calendar cl = Calendar.getInstance();
		System.out.println("現在日時：" + cl.getTime());
		
		
		// set()メソッドで年を設定
		cl.set(Calendar.YEAR, 2019);
		
		System.out.println("変更後日時：" + cl.getTime());
		
	}
}
```
```:実行結果
現在日時：Sun Oct 01 10:07:02 JST 2023
変更後日時：Tue Oct 01 10:07:02 JST 2019
```

### ・まとめて日付を設定する【応用】
　上記のようにフィールドを指定して設定する他に、まとめて設定する方法があります。`set()`メソッドにはオーバーロードされたメソッドが３つあります。
```java:
public void set​(int year, int month, int date)
```
```java:
public void set​(int year, int month, int date, int hourOfDay, int minute)
```
```java:
public void set​(int year, int month, int date, int hourOfDay, int minute, int second)
```
　
　以下のサンプルコードでは、３つのset()メソッドを使って日付を設定してみます。

```java:set()メソッドで年の設定
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {
		
		// Calendarクラスの生成と現在日時の出力
		Calendar cl = Calendar.getInstance();
		System.out.println("現在日時　　　　：" + cl.getTime());
		
		
		// set()メソッドでまとめて要素を設定
		cl.set(2019,1,1);
		System.out.println("年月日変更　　　：" + cl.getTime());
		
		cl.set(2019,1,1,1,1);
		System.out.println("年月日時分変更　：" + cl.getTime());
		
		cl.set(2019,1,1,1,1,1);
		System.out.println("年月日時分秒変更：" + cl.getTime());
		
	}
}
```
```:実行結果
現在日時　　　　：Sun Oct 01 10:25:37 JST 2023
年月日変更　　　：Fri Feb 01 10:25:37 JST 2019
年月日時分変更　：Fri Feb 01 01:01:37 JST 2019
年月日時分秒変更：Fri Feb 01 01:01:01 JST 2019
```

### ・add()メソッドで日付を加算/減算する
　ここでは`add()`メソッドを使って日付を設定する方法を説明します。
`add()`メソッドは、第一引数にフィールド、第二引数に加算または減算を入れて、要素を変更することができます。
```java:
public abstract void add​(int field, int amount)
```
　以下のサンプルコードのようにset()メソッドを使うことで「年」を変更できます。第一引数は、Calendarクラスのフィールドを指定することで設定する要素を選ぶことができます。

```java:set()メソッドで年の設定
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {
		
		// Calendarクラスの生成と現在日の出力
		Calendar cl = Calendar.getInstance();
		System.out.println("現在日時　　　：" + cl.getTime());
		
		
		// add()メソッドで要素を変更
		cl.add(Calendar.YEAR, 1);
		System.out.println("１年追加　　　：" + cl.getTime());
		
		cl.add(Calendar.MONTH, -1);
		System.out.println("１月減算　　　：" + cl.getTime());
		
		
		
	}
}
```
```:実行結果
現在日時　　　：Sun Oct 01 10:38:22 JST 2023
１年追加　　　：Tue Oct 01 10:38:22 JST 2024
１月減算　　　：Sun Sep 01 10:38:22 JST 2024
```