Javaの日時を計算するサンプルです。加算と減算を行います。
目次
計算 | LocalDateTimeクラスで日時を計算する |
Calendarクラスで日時を計算する |
LocalDateTimeクラスで日時を計算する
LocalDateTimeクラスで日時を計算するサンプルです。
LocalDateTimeクラスはJava8で導入されました。計算のやり方がわかりやすくなっています。
package test1;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Test1 {
public static void main(String[] args) {
// 指定日時をセット 2016/12/30 22:30:10
LocalDateTime ldt1 = LocalDateTime.of(2016,12,30,22,30,10);
//2年後を求める
LocalDateTime date1 = ldt1.plusYears(2);
System.out.println(date1); //2018-12-30T22:30:10
//2ヶ月後を求める
LocalDateTime date2 = ldt1.plusMonths(2);
System.out.println(date2); //2017-02-28T22:30:10
//2日前を求める
LocalDateTime date3 = ldt1.minusDays(2);
System.out.println(date3); //2016-12-28T22:30:10
//2時間20分20秒後を求める
LocalDateTime date4 = ldt1.plusHours(2).plusMinutes(20).plusSeconds(20);
System.out.println(date4); //2016-12-31T00:50:30
// String型+表示形式を指定する
DateTimeFormatter dtFormat
= DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
String fdate4 = date4.format(dtFormat);
System.out.println(fdate4); // 2016/12/31 00:50:30
}
}
9行目は、LocalDateTimeクラスのofメソッドで年月日と時分秒を指定しています。
指定日時の引数の月は、-1する必要がありません。(Calendarクラスでは月を-1する必要があります)
12,16,24行目のメソッドは、足し算を意味するplus***という名称になっています。
20行目のメソッドは、引き算を意味するminus***という名称になっています。
28行目以降は、表示形式をyyyy/mm/dd形式に変換しています。
29行目のDateTimeFormatterクラスで表示形式を指定しています。
30行目は、指定した表示形式に変換しています。
計算のメソッド
以下は、LocalDateTimeクラスの主な計算のメソッドです。
意味 | メソッド |
---|---|
年 | plusYears/minusYears |
月 | plusMonths/minusMonths |
日 | plusDays/minusDays |
時 | plusHours/minusHours |
分 | plusMinutes/minusMinutes |
秒 | plusSeconds/minusSeconds |
LocalDateTimeクラス
- タイムゾーンのない日付/時間を扱います。
- Java8で導入されました。Date and Time APIと呼ばれています。
- イミュータブルかつスレッドセーフです。
- 以下は、Java8 API仕様のLocalDateTimeクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDateTime.html
イミュータブル
- インスタンスを作成した後、そのインスタンスの状態が変わらないことです。
- 日付を加算をしても元のインスタンスは変わらず新しいインスタンスを返します。
- Calendarクラスのインスタンスは状態を変えることができます。→ミュータブルです。
スレッドセーフ
- 複数のスレッドが同時に実行しても大丈夫です。
Calendarクラスで日時を計算する
Calendarクラスで日時を計算するサンプルです。
2016年12月30日 22:30:10の2日後を求めます。
package test1;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Test1 {
public static void main(String[] args) {
// インスタンスを生成
Calendar cal1 = Calendar.getInstance();
// 指定日時をセット 2016/12/30 22:30:10
cal1.set(2016,11,30,22,30,10);
// 指定した日時の2日後を求める
cal1.add(Calendar.DATE, 2);
// Date型に変換
Date date1 = cal1.getTime();
System.out.println(date1); //Sun Jan 01 22:30:10 JST 2017
// 表示形式を指定
SimpleDateFormat sdformat
= new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String fdate1 = sdformat.format(date1);
System.out.println(fdate1); // 2017/01/01 22:30:10
}
}
9行目は、カレンダークラスのインスタンスを生成しています。
12行目は、計算元の日時を指定しています。注意点として、月は0から始まるという仕様になっています。そのため12月にしたい場合は11を指定します。
15行目は、指定した日時の2日後を求めています。この時点の変数cal1の中身は、・・,YEAR=2017,MONTH=0,・・などでYYYY/MM/DDの形式になっていません。
そのためこれ以降で、YYYY/MM/DDの表示形式にします。
18行目は、Date型に変換しています。
23行目のSimpleDateFormatクラスで表示形式を指定しています。
24行目は、指定した表示形式に変換しています。
Calendarクラスで1日前を求める場合
上記12行目を以下のように変更します。
cal1.add(Calendar.DATE, -1);
2つめの引数を-1にしています。
Calendarクラスで3時間後を求める場合
上記12行目を以下のように変更します。
cal1.add(Calendar.HOUR_OF_DAY, 3);
1つめの引数をHOUR_OF_DAYにしています。
hourは時間という意味です。
フィールド
以下は、主なフィールドです。
意味 | フィールド |
---|---|
年 | Calendar.YEAR |
月 | Calendar.MONTH |
日 | Calendar.DATE |
時 | Calendar.HOUR_OF_DAY |
分 | Calendar.MINUTE |
秒 | Calendar.SECOND |
以下は、Java8 API仕様のCalendarクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Calendar.html
関連の記事