Java gold 例題 Locale, DateTimeFormatter

次のコードで `/* insert code */`部分に入力すると下記の出力結果が得られるものはどれでしょうか

```java
public class ParseTest {

	public static void main(String[] args) {
        Locale.setDefault(Locale.US);
		var pattern = DateTimeFormatter.ofPattern("yyyy MM dd");
		String Sdate = "2020 07 22";
		LocalDate date = LocalDate.parse(Sdate, pattern);
		
		Locale[] locales = {
				new Locale.Builder().setLanguage("en").setRegion("US").build(),
				new Locale("ja", "JP"),
				Locale.ITALY,
				Locale.KOREA,
				Locale.GERMANY
        };
		
		for(Locale loc: locales) {
			var fmt = 
               DateTimeFormatter.ofLocalizedDate(/* insert code */).localizedBy(loc);
			
            System.out.println("country  : " + loc.getDisplayCountry());
			System.out.println("language : " + loc.getDisplayLanguage());
			System.out.println(fmt.format(date) + "\n");
		}
	}
}
```

出力
```java
country  : United States
language : English
Wednesday, July 22, 2020

country  : Japan
language : Japanese
2020年7月22日水曜日

country  : Italy
language : Italian
mercoledì 22 luglio 2020

country  : South Korea
language : Korean
2020년 7월 22일 수요일

country  : Germany
language : German
Mittwoch, 22. Juli 2020
```

1. FormatStyle.SHORT
1. FormatStyle.MEDIUM
1. FormatStyle.LONG
1. FormatStyle.FULL
1. 該当なし、もしくはコンパイルエラー

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓

↓


4: FormatStyle.FULL

`DateTimeFormatter.ofLocalizedDate()`の引数には、
`FormatStyle`の値を指定する必要があります。
例として、
`FormatStyle.SHORT`、`FormatStyle.MEDIUM`
`FormatStyle.LONG`、`FormatStyle.FULL`
があります。

`localizedBy(loc)`で特定のロケールにもとづいてフォーマットを行います。
例 `loc`がJAPAN

`FormatStyle.SHORT`の場合
```
2020/07/22
```
`FormatStyle.MEDIUM`の場合
```
2020/07/22
```
`FormatStyle.LONG`の場合
```
2020年7月22日
```
`FormatStyle.FULL`の場合]
```
2020年7月22日水曜日
```
よって`FormatStyle.FULL`が正解です。


補足
```java
Locale.setDefault(Locale.US);
```
デフォルトロケールの設定をUSに変更しています。
デフォルトロケールの設定を削除すると本コードの出力結果の
`country`, `language`が日本語で表示されます。
```
country  : アメリカ合衆国
language : 英語
Wednesday, July 22, 2020

country  : 日本
language : 日本語
2020年7月22日水曜日

country  : イタリア
language : イタリア語
mercoledì 22 luglio 2020

country  : 韓国
language : 韓国語
2020년 7월 22일 수요일

country  : ドイツ
language : ドイツ語
Mittwoch, 22. Juli 2020
```
次のコード
```java
var pattern = DateTimeFormatter.ofPattern("yyyy MM dd");
```
`DateTimeFormatter`は、日時を特定の形式でフォーマットするためのクラスです。ここでは、`"yyyy MM dd"`というパターンで日付をフォーマットするためのフォーマッターを作成しています。
あくまで読みこみ時に利用するため、この形式で出力されるわけではありません。

```java
String Sdate = "2020 07 22";
```
フォーマットされた日付の文字列が用意されています。

```java
LocalDate date = LocalDate.parse(Sdate, pattern);
```
`Sdate`の文字列を`LocalDate`オブジェクトに変換しています。ここで、先ほど作成した`DateTimeFormatter`の`pattern`を使用して、指定された形式の日付文字列をパースしています。

```java
System.out.println("country : " + loc.getDisplayCountry());
```
ロケールの国名を取得して表示しています。

```java
System.out.println("language : " + loc.getDisplayLanguage());
```
ロケールの言語名を取得して表示しています。

```java
Locale[] locales = 略
```
部分ではロケールのインスタンスを取得し、配列`locales`に代入しています。
インスタンスを取得する方法は以下の例があります。

・ コンストラクタを使う
```java
Locale loc = new Locale("ja");
Locale location = new Locale("ja", "JP");
```

・定数を使う
```java
Locale loc = Locale.JAPAN
```
・ `locale.Builder`を使う
```java
Locale loc = new Locale.Builder().setLanguage("ja").setRegion("JP").build();
```
・`getDefault()`を使う
```java
Locale loc = getDefault();
```

・`forLanguageTag`を使う
```java
Locale loc = Locale.forLanguageTag("en-US");
```
よって本コードでは問題なくインスタンスを取得できています。

https://qiita.com/T-ngtj/private/df254aacd05be698199a