【Java・学習ログ14】日付と時刻について

教本に沿ってやってみたシリーズ、『第15章』その２。
≪使用教材≫スッキリわかるJava入門　第3版　スッキリわかるシリーズ

## ■日付と時刻
**基準日付(エポック)**…1970年1月1日0時0分0秒
日時情報を扱うには下記のような形式がある。

- <b>long型</b>

基準日時(エポック)から経過したミリ秒で記述する方法。
現在日時を得られる<font color = red>System.currenTimeMillisメソッド</font>を用いて処理時間の計測を行う。
```java
public class Main {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();

        long end = System.currentTimeMillis();
    System.out.println("処理に掛かった時間は" + (end - start) + "ミリ秒");
}
```
- <b>date型</b>
Javaで日時を扱う場合に最も利用される形式。
<font color=red</font>java.util.Dateクラス</font>からインスタンスを生成する。
```java
import java.util.Date;

public class Main {
    public static void main(String[] args){
        Date now = new Date(); // 現在日時の取得
        System.out.println(now);
        System.out.println(now.getTime()); // long値の取り出し
        Date past = ndw Date(1600705425827L) 
        System.out.println(past);
}
```
- <b>int型</b>
現在時刻を割り出すには「System.currenTimeMillisメソッドを使う」「Dateをnewする」が有効的だが、指定時刻を示す場合には整数(int)を使うのが一般的。

- <b>String型</b>
画面に時刻を表示する場合にはStringに変換しなければならない。


### ■APIを活用する
- ##### java.util.Calendar
(date型＋int型)
```Java
import java.util.Calendar;
import java.util.Date;

public class Main {
	public static void main(String[] args){
		
		/* int値→Date型　*/
		Calendar c = Calendar.getInstance();
		c.set(1993,9,11,1,23,45); // ６つのint値を設定
		c.set(Calendar.MONTH, 6); // 月を7月に変更
		Date d = c.getTime(); // int値を引き出してDate型に格納
		System.out.println(d); 
		// 【実行結果】Sun Jul 11 01:23:45 JST 1993
		
		/* Date型→int値　*/
		Date now = new Date(); // Date型インスタンスを生成
		c.setTime(now); // 現在時刻を取得
		int y = c.get(Calendar.YEAR); // YEARのみ取り出し
		System.out.println("今年は" + y + "年です");
		// 【実行結果】今年は2023年です
	}
}
```
※月の取得には0～11を指定する

- ##### java.text.SimpleDateFormat
（Date型＋String型）
```java
import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
	public static void main(String[] args) throws Exception {
		
		SimpleDateFormat f =
				new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); // 書式文字列を指定

		/* String⇒Date */
		Date d = f.parse("2020/12/05 01:23:45"); // 文字列を挿入
		System.out.println(d); 
		// 【実行】Sat Dec 05 01:23:45 JST 2020
		
		/* Date⇒String */
		Date now = new Date(); // 現在時刻の取得
		String s = f.format(now);
		System.out.println("現在は" + s + "です");
		// 【実行】現在は2023/10/10 21:12:39です
	}
}
```
- ##### java.timeパッケージ
javaの新たな日時API。
Dateに代わり、ナノ秒単位で瞬間を捉える**Instantクラス**や、Calendarクラスに代わる**ZonedDateTimeクラス**が存在する。
![スクリーンショット 2023-10-10 215134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/4863e531-87a3-a70d-e30d-4d931d6f3aee.png)
※Time APIの多くではnewが禁止されているため、インスタンスを生成するには静的メソッドであるnow()やof()を使用する。

タイムゾーン情報を含まない曖昧な日時情報を捉える**LocalDateTimeクラス**などは広く利用される。

その他曖昧な日時情報を表すクラスは、java.time.Temporalインタフェースを実装している。
同様の動作を指示する場合にはメソッドを呼び出すが、共通のメソッド名を使うように設計されている。

| | |
|-|-|
|now()|現在日時からインスタンスを生成|
|of()/of～()|他の種類から変換してインスタンスを生成|
|parse()|文字列からインスタンスを生成 ※書式はDateTimeFormatで指定|
|format()|保持情報をインスタンスに変換|
|get～()|年や月の情報を取得する|
|isAfter()/isBefore()|引数で渡したインスタンスとの前後関係を判定|
|plus～()/minus～()|指定した分だけ未来、過去の時点を返す。|

![スクリーンショット 2023-10-11 204143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/c7b8f0cf-f6f3-8b9b-1271-08cd87ed85b5.png)

### ２つの時刻を格納するTime API
- <b>Durationクラス</b>
「秒～時間」以下の間隔を表す場合に用いる。
- <b>Periodクラス</b>
「日数」ベースの期間を表す場合に用いる。

<hr>

(簡易メモ)
1. 難しすぎたので省略