スッキリわかるJava入門 第３版を読んでみて- part15 - 文字列と日付の扱い

# はじめに
こんにちは(・ω・）ﾉ
今回は文字列と日付の扱いについて学びました！
## 第１５章　文字列と日付の扱い
### 1.文字列処理とは
文字列の情報を処理する、さまざまな方法の総称... __文字列処理__（テキスト処理）
文字列操作の多くはStringクラスに備わっているメソッドを利用する

### 2.基本的な文字列操作
文字列を調査する
![スクリーンショット 2023-08-24 10.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336192/5867473e-cab4-30d2-b048-e4c9b66f617b.png)

文字列を検索する
![スクリーンショット 2023-08-24 10.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336192/81a204ec-9fda-9f01-36ec-0dafc688e6ad.png)
※先頭位置を0として指定することに注意
文字列を切り出す
![スクリーンショット 2023-08-24 10.41.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336192/599b2e30-b03f-4b16-aa13-baa5dd7b0885.png)
※先頭位置を0として指定することに注意
文字列を変換する
![スクリーンショット 2023-08-24 11.01.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336192/4cc436fd-f353-843e-9573-60bedf6cead7.png)
※全角スペースは除去されない

### 3.文字列の連結
文字列の連結方法
　＋演算子を用いる方法

:new: StringBuilderクラスを用いた連結
　性能が＋演算子を使う4000倍

用いる２つの手順
1.appendメソッドを呼んでバッファに文字列を追加していく（必要に応じた回数を呼び出す）
2.最後に１回だけtoString()を呼び、完成した連結済みの文字列を取り出す

:sparkles:Stringインスタンスの不変性
Stringインスタンスが保持する文字列情報は、
インスタンス化した際に初期化され、以後二度と変化することはない

Stringクラスに限らず、「インスタンス化の後に内容が絶対に変化しない」ように設計されたクラス
... __不変__(immutable)

StringBuilderは可変のクラスとして設計されている。
そのため、高速に処理ができる。

### 4.正規表現の活用
引数で与える文字列...文字列パターン
「文字列の形式的な条件」を文法に従って記述したもの...正規表現
文字列がパターンに従った形式を満たしているかを照合する処理...パターンマッチング

##### 正規表現の基本文法
1.通常の文字：その文字でなければならない
2.ピリオド：任意の１文字であればよい
3.アスタリスク：直前の文字の０回以上の繰り返し
4.波カッコ：指定回数の繰り返し
5.角カッコ：いずれかの文字
6.角カッコ内のハイフン
7.ハットとダラー：先頭と末尾

正規表現を用いたほかの処理
１つの文字列を複数に分割できる
splitメソッド：文字列の分割

文字列中でパターンに一致した箇所を別の文字列に置換できる
replaceAllメソッド：文字列の置換


### 5.文字列の書式整形
書式指定文字列型...組み立てる文字列のひな形を指定する
プレースホルダ...第２引数以降で指定した具体的な値が順に流し込まれる場所

:pencil2: 書式を指定して画面に表示する
`System.out.println(書式文字列,パラメータ...);`

### 6.日付と時刻を扱う
日時情報を扱う2つの基本形式
形式１：long型の数値
　基準日時(エポック)から経過したミリ秒数で日時情報を表現する方法
形式２：Date型のインスタンス
　Javaで日時の情報を扱う場合に最も利用される形式

:pencil2: 現在日時をもつDateインスタンスの生成
`Date d = new Date();`

:pencil2: 指定時点の日時を持つDateインスタンスの生成
`Date d = new Date(long 値);`

人間が扱いやすい２つの形式
形式３：人間が指定しやすい「６つのint」形式
形式４：人間が読みやすいString型のインスタンス

上記の４つの形式を自由に利用できるためには
1・Date型と６つのint値の相互変換
2・Date型とString型の相互変換

1・Date型と６つのint値の相互変換の解決方法
:pencil2: 「６つのint値」からDateインスタンスを生成する
```
Calendar c = Calendar.getInstance();
c.set(年、月、日、時、分、秒);
または
c.set(Calendar.~,値);
Date d = c.getTime();
```

:pencil2:Dateインスタンスから「6つのint値」を生成する
```
Calendar c = Calendar.getInstance();
c.setTime(d);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
```

2・Date型とString型の相互変換の解決
:pencil2:StringからDateインスタンスを生成する
```
SimpleDateFormat f = new SimpleDateFormat(書式文字列);
Date d = f.parse(文字列);
```

:pencil2:DateインスタンスからStringを生成する
```
SimpleDateFormat f = new SimpleDateFormat(書式文字列);
String s = f.format(d);
```

:sparkles: DateやCalendarが抱えている代表的な問題点
1.使い方が紛らわしいAPIが存在する
2.並列処理で用いるとインスタンスの内容が壊れることがある

:sparkles: DateやCalendarの機能的な限界
・最小でも「ミリ秒」単位でしか時間を扱えない
・私たちが日常利用する「曖昧な日時」を表せない
・私たちが日常利用する「時間の幅」を表せない

### 7.Time API
　Java.timeパッケージの代表的なクラス
![スクリーンショット 2023-08-25 10.27.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336192/38d8e1df-8205-5344-9804-a6524975dce3.png)

:sparkles: 曖昧な日時の必要性
人は普段タイムゾーン情報が欠落した「曖昧な日時」を使って生活している。
しかし、そんな日時情報を正しくJavaの世界で再現する手段がなかった。


## まとめ
Stringクラスに備わっているメソッドを使って、さまざまな文字列操作を行うことができる。
正規表現を使うことでさまざまなパターンマッチングを表現できる。
日時情報は基本的にjava.util.Date型で扱う
さらに厳格な時刻の格納にはInstantクラスやZonedDateTimeクラス、曖昧な日時の表現にはLocalDateやYearMonthなどの複合クラスが、時間の間隔にはDurationクラスPeriodクラスを格納するなどそれぞれに対応するクラスを扱う

日付と時刻のところであまり理解ができていないと感じました。
それぞれのクラスでの特徴の違いを理解することで覚えていきたいと感じました。
あとはCalendarクラスの部分があまり...って感じだったかなと思います。

今回もありがとうございました！
ではまた〜　＊˙︶˙＊)ﾉ"