【Java入門】Calendarクラスの日付フォーマットを指定する方法（SimpleDateFormat,DateFormat)

# SimpleDateFormatクラス
## SimpleDateFormatクラスとは
　Javaには日付を取得したり、日付を演算することができるCalendarクラスがあります。SimpleDateFormatは、パターンを指定し、Calendarクラスを分かりやすいようにフォーマットする機能があります。
### ・構造
　java.lang.Object
　　　java.text.Format
　　　　　java.text.DateFormat
　　　　　　　java.text.SimpleDateFormat

### ・使い方
　コンストラクタの引数にパターンを入れて初期化できます。
```java:フォーマット指定
SimpleDateFormat  オブジェクト名 = new SimpleDateFormat(”フォーマットパターン”)
```
　`format()`メソッドの引数にDateオブジェクトを指定することで、コンストラクタで初期化したパターンにフォーマット化することができます。
```java:パターンに従ってフォーマット
オブジェクト名.format(date)
```

### ・使用例
　以下のサンプルコードでは、CalendarクラスをSimpleDateFormatのフォーマット化機能を使うことで出力の仕方を変えています。
　`format()`メソッドの引数に入っている`getTime()`メソッドは戻り値にDateオブジェクトを返します。

```java:Calendarクラスをフォーマット化して出力
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {
		
		// Calendarクラスの生成と現在日時の出力
		Calendar cl = Calendar.getInstance();
		System.out.println("現在日時：" + cl.getTime());
		
		
		// SimpleDateFormatでパターン指定とフォーマット
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
		System.out.println("フォーマット化：" + sdf.format(cl.getTime())); 
		
	}
}
```
```:実行結果
現在日時：Sun Oct 01 11:31:37 JST 2023
フォーマット化：2023年10月01日
```

## SimpleDateFormatで使う主なパターンを使用例
### ・主なパターン
　SimpleDateFormatに使えるパターンは指定されたものでなければいけません。ここでは主なパターンを紹介します。

[パターン（SimpleDateFormat API)](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/text/SimpleDateFormat.html#%3Cinit%3E(java.lang.String,java.util.Locale))

### ・秒まで表示する方法
```java:年　月　日　時　分　秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH時mm分ss秒");
System.out.println("フォーマット化：" + sdf.format(cl.getTime())); 
```
### ・曜日を表示する方法
```java:曜日
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日(E)");
System.out.println("フォーマット化：" + sdf.format(cl.getTime())); 
```

### ・和暦(元号)で表示する方法　
```java:和暦
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class Main {
	public static void main(String[] args) {
		
		// Localeクラスの生成
		Locale jp = new Locale("ja", "JP", "JP");
		
		// Calendarクラスの生成と現在日時の出力
		Calendar cl = Calendar.getInstance();
		System.out.println("現在日時：" + cl.getTime());
		
		
		// SimpleDateFormatでパターン指定とフォーマット
		SimpleDateFormat sdf = new SimpleDateFormat("GGyy年MM月dd日(E)", jp);
		System.out.println("フォーマット化：" + sdf.format(cl.getTime())); 
		
	}
}
```

## 途中でフォーマットを変更したい場合
　`applyPattern()`メソッドを使い、引数にコンストラクタで指定したようにパターンを指定するとフォーマットが変更されます。

```java:フォーマットの変更
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {
		
		
		// Calendarクラスの生成と現在日時の出力
		Calendar cl = Calendar.getInstance();
		System.out.println("現在日時：" + cl.getTime());
		
		
		// SimpleDateFormatでパターン指定とフォーマット化
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日(E)");
		System.out.println("フォーマット化：" + sdf.format(cl.getTime())); 
		
        //フォーマットを変更する
        sdf.applyPattern("yyyyMMdd");
        System.out.println("変更後：" + sdf.format(cl.getTime()));
	}
}
```
# DateFormatクラス
## DateFormatクラスとは
　DateFormatはSimpleDateFormatの親クラスであり、同様にフォーマット化することができます。ただし、SimpleDateFormatと違ってやり方は変わります。

### ・構造
　java.lang.Object
　　　java.text.Format
　　　　　java.text.DateFormat

### ・使い方
　new演算子ではなくgetInstanceメソッドを使用してインスタンスを生成します。
```java:フォーマット指定
DateFormat df = DateFormat.getInstance()
```
　またDateFormatには直接的にパターン指定する方法はないのでデフォルトの設定しかできません。詳細にパターン指定する場合は、前述のSimpleDateFormatを使います。


### ・使用例
　以下のサンプルコードでは、CalendarクラスをDateFormatクラスでフォーマット化しています。
　`format()`メソッドの引数に入っている`getTime()`メソッドは戻り値にDateオブジェクトを返します。

```java:DateFormatでフォーマット化
import java.text.DateFormat;
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {


		// Calendarクラスの生成と現在日時の出力
		Calendar cl = Calendar.getInstance();
		System.out.println("現在日時：" + cl.getTime());

		// DateFormatでフォーマット化
		DateFormat df = DateFormat.getInstance();
		System.out.println("フォーマット化：" + df.format(cl.getTime()));
	}
}
```
```:実行結果
現在日時：Sun Oct 01 12:13:07 JST 2023
フォーマット化：2023/10/01 12:13
```

# Date型とString型の変換

## 文字列型を日付型（date)に変換
　
### ・概要
 SimpleDateFormatの`parse()`メソッドを使用して文字列を日付型（date）に変換します。
まずSimpleDateFormatで文字列のフォーマットを指定します。次に`parse()`メソッドの引数に文字列を入れて、Calendarクラスの`setTime()`メソッドの引数に入れてセットします。

:::note warn
SimpleDateFormatとフォーマットと文字列のパターンが同じにしないと例外が発生します。
:::



### ・使い方

```java:文字列⇒Date型
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class ParseSamp {
	public static void main(String[] args) {

		try {
			
			String date = "2023年10月15日 11時11分11秒";
			System.out.println(date);
			
			Calendar cl = Calendar.getInstance();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒");
			cl.setTime(sdf.parse(date));
			System.out.println(cl.getTime());

		} catch (ParseException e) {
			e.printStackTrace();
		}
```

```:実行結果
2023年10月15日 11時11分11秒
Sun Oct 15 11:11:11 JST 2023
```

## 日付型（date)を文字列型に変換
　
### valueOfで変換する
　日付型（date)を文字列型に変換するのに`valueOf`メソッド使う場合を説明します。
`valueOf`メソッドは引数に、Dateの値を指定するとString型に変換されます。

<details><summary>valueOfメソッドとは</summary>
　valueOfメソッドは引数に指定したさまざまな型の値を、String型の文字列として返します。
このメソッドはオーバーロードされており、Date型（Object）の他にshort型、int型、long型、float型、double型など引数に指定し、簡単にString型に変換することができます。

</details>

#### ・使い方
```java:Calendar⇒String型
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {
		
		// Calendarクラスの生成とvalueOfメソッドで変換
		Calendar cl = Calendar.getInstance();
		String str = String.valueOf(cl.getTime());
		
		// 現在日時の出力
		System.out.println(str);
	}
}
```

```:実行結果
Mon Oct 09 20:26:47 JST 2023
```

### SimpleDateFormatで変換する
　SimpleDateFormatでパターンを指定してから、SimpleDateFormatが持つ`format()`メソッドにDate型を入れると文字列型に変換できます。前述のvalueOfと違い、この方法だとパターンを指定して文字列化できます。


### ・使い方

```java:Date型⇒文字列
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Sample {
	public static void main(String[] args) {

		Calendar cl = Calendar.getInstance();
		System.out.println(cl.getTime());
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		String str = sdf.format(cl.getTime());
		System.out.println(str);
```

```:実行結果
Mon Oct 09 20:21:00 JST 2023
2023年10月09日 08時21分00秒
```