Javaで日付と時刻を扱う



## java.time.LocalDateTime(java8)

- LocalDateTime now = LocalDateTime.now();
- LocalDateTime ymd = LocalDateTime.of(2016, 1, 1, 0, 0);
- LocalDateTime ymdhms = LocalDateTime.of(2016, 1, 1, 23, 59, 59);
- int year = ymd.getYear();
- int month = ymd.getMonth().getValue();
- int date = ymd.getDayOfMonth();
- DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
- dtf.format(ymdms);
- 「[Java8の日時APIはとりあえずこれだけ覚えとけ](http://qiita.com/tag1216/items/91a471b33f383981bfaa#date%E3%81%A8%E3%81%AE%E7%9B%B8%E4%BA%92%E5%A4%89%E6%8F%9B)」が参考になる

## (java7なら）Joda-Time
- 「[Joda-Timeを使った日付処理まとめ](http://qiita.com/rubytomato@github/items/a9abb4f766e905c0c227)」が参考になる

## java.util.Date（できれば使わない）
- 日時データを保持するだけのクラス
- このクラスから直接「年月日」を取得するメソッドは既に非推奨となっている。
- 書式を整えるにはDateFormatクラスを使う

```
SimpleDateFormat sdf = new SimpleDateFormat("kk:mm");
// 11:30以前の場合
if (sdf.parse(data.get(1)).compareTo(sdf.parse("11:30")) <= 0) {
　　System.out.println("お昼前だよ");
}
```
- Calendar型に変換
    - cal.setTime(date);
- BigDecimal型のUTCをもとにDate型を作成
    - BigDecimal utc = (BigDecimal) array.get(0);
    - Date day = new Date(utc.longValue());

- java.sql.Dateに変換する

 ```java
            public static java.sql.Date toSqlDate(java.util.Date date) {
                return new java.sql.Date(date.getTime());
            }
```
            


       
## java.util.Calendar（できれば使わない）
- 月は0~11
- Calendar cal = Calendar.getInstance();
- cal.set(2015,11,31, 0, 0, 0); // 2015/12/31 am0:00
- cal.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
- int year = cal.get(Calendar.YEAR);
- int month = cal.get(Calendar.MONTH) - 1;
- int date = cal.get(Calendar.DATE);
- cal.add(Calendar.DAY_OF_MONTH, 1); // 1日加算
- cal.add(Calendar.DAY_OF_MONTH, -2); // 2日減算
- cal.add(Calendar.MONTH, 1); // 1か月加算
- cal.add(Calendar.YEAR, -1); // 1年減算
- Dateに変換
    - Date date = cal.getTime();
- java.text.SimpleDateFormat
    - SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    - sdf.format(cal.getTime());

## 時刻を扱う

プログラムの実行時間をはかる

### org.apache.commons
```build.gradle
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.10'
```

```java
StopWatch stopWatch = new StopWatch();

// 計測開始
stopWatch.start();

Thread.sleep(500);

// 計測停止
stopWatch.stop();

// 経過時間出力
System.out.println(stopWatch.getTime()); // ⇒500
```

###  org.springframework.util.StopWatch
```java
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// ... more
stopWatch.stop();
System.out.println(stopWatch.getTotalTimeMillis());
System.out.println(stopWatch.prettyPrint());
```

### プレーン

```java
	// 全体の「時間:分:秒」
	 private String formatedTimeV2(long millis) {
	        return String.format("%02d:%02d:%02d", 
	                TimeUnit.MILLISECONDS.toHours(millis),
	                TimeUnit.MILLISECONDS.toMinutes(millis) - 
	                TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
	                TimeUnit.MILLISECONDS.toSeconds(millis) - 
	                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
	         );
	 }
	// 個別の「分 min, 秒 sec」
	private String formatedTime(long millis) {
		return String.format("%d min, %d sec", 
			    TimeUnit.MILLISECONDS.toMinutes(millis),
			    TimeUnit.MILLISECONDS.toSeconds(millis) - 
			    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
			);
	}

	@Test
	public void formatTime() throws InterruptedException {
		long start = System.currentTimeMillis();
		Thread.sleep(1000);
		long end = System.currentTimeMillis();
		System.out.println(formatedTime(end - start));
	}
```

結果

```
0 min, 1 sec
```