Javaの日時の加算と減算のサンプルです。
LocalDateTimeクラスはJavaSE8で導入されました。計算がわかりやすくなっています。
目次
- 日時を加算するサンプル(LocalDateTimeクラス)
- 日時を減算するサンプル(LocalDateTimeクラス)
- Calendarクラスで2日後を求める
- Calendarクラスで1日前を求める
- Calendarクラスで3時間後を求める
日時を加算するサンプル(LocalDateTimeクラス)
LocalDateTimeクラスで日時を指定して加算するサンプルです。
package test1;
import java.time.LocalDateTime;
public class Test1 {
public static void main(String[] args) {
// 指定日時をセット 2016/12/30 22:30:10
LocalDateTime d = LocalDateTime.of(2016,12,30,22,30,10);
//2年後を求める
LocalDateTime d1 = d.plusYears(2);
System.out.println(d1); //2018-12-30T22:30:10
//2ヶ月後を求める
LocalDateTime d2 = d.plusMonths(2);
System.out.println(d2); //2017-02-28T22:30:10
//2日後を求める
LocalDateTime d3 = d.plusDays(2);
System.out.println(d3); //2017-01-01T22:30:10
//2時間20分20秒後を求める
LocalDateTime d4 = d.plusHours(2).plusMinutes(20).plusSeconds(20);
System.out.println(d4); //2016-12-31T00:50:30
}
}
9行目の指定日時の引数は、月を-1する必要がありません。(Calendarクラスでは必要です)
12,16,20,24行目のメソッドは、足し算を意味するplus***という名称になっています。
日時を減算するサンプル(LocalDateTimeクラス)
LocalDateTimeクラスで日時を指定して減算するサンプルです。
package test1;
import java.time.LocalDateTime;
public class Test1 {
public static void main(String[] args) {
// 指定日時をセット 2016/12/30 22:30:10
LocalDateTime d = LocalDateTime.of(2016,12,30,22,30,10);
//2年前を求める
LocalDateTime d1 = d.minusYears(2);
System.out.println(d1); //2014-12-30T22:30:10
//2ヶ月前を求める
LocalDateTime d2 = d.minusMonths(2);
System.out.println(d2); //2016-10-30T22:30:10
//2日前を求める
LocalDateTime d3 = d.minusDays(2);
System.out.println(d3); //2016-12-28T22:30:10
//2時間20分20秒前を求める
LocalDateTime d4 = d.minusHours(2).minusMinutes(20).minusSeconds(20);
System.out.println(d4); //2016-12-30T20:09:50
}
}
9行目の指定日時の引数は、月を-1する必要がありません。(Calendarクラスでは必要です)
12,16,20,24行目のメソッドは、引き算を意味するminus***という名称になっています。
LocalDateTimeクラス(JavaSE8から)
- タイムゾーンのない日付/時間を扱います。
- JavaSE8で導入されました。Date and Time APIと呼ばれています。
- イミュータブルかつスレッドセーフです。
- ISO8601をベースにしています。ISO8601は、日付と時刻の表記に関する国際規格です。
https://ja.wikipedia.org/wiki/ISO_8601 - 以下は、Java8 API仕様のLocalDateTimeクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDateTime.html
イミュータブル
- インスタンスを作成した後、そのインスタンスの状態が変わらないことです。
- 日付を加算をしても元のインスタンスは変わらず新しいインスタンスを返します。
- Calendarクラスのインスタンスは状態を変えることができます。→ミュータブルです。
Calendarクラスで2日後を求める
Calendarクラスで2日後を求めるサンプルです。
2016年12月30日 22:30:10の2日後を求めます。
package test1;
import java.util.Calendar;
public class Test1 {
public static void main(String[] args) {
// インスタンスを生成
Calendar cal = Calendar.getInstance();
// 指定日時をセット 2016/12/30 22:30:10
// 注:月は0から始まり、11で終わる
cal.set(2016,11,30,22,30,10);
// 指定した日時の2日後を求める
cal.add(Calendar.DATE, 2);
// 日時の取得
int d1 = cal.get(Calendar.YEAR);
int d2 = cal.get(Calendar.MONTH) + 1; //月は0~11なので1を足す
int d3 = cal.get(Calendar.DATE);
int d4 = cal.get(Calendar.HOUR_OF_DAY);
int d5 = cal.get(Calendar.MINUTE);
int d6 = cal.get(Calendar.SECOND);
// 結果 2017/1/1 22:30:10
System.out.println(d1 + "/" + d2 + "/" + d3 +
" " + d4 + ":"+ d5 + ":"+ d6);
}
}
16行目のaddメソッドで2日後を求めています。
Calendarクラスで1日前を求める
Calendarクラスで1日前を求めるサンプルです。
2017年1月1日 22:30:10の1日前を求めます。
package test1;
import java.util.Calendar;
public class Test1 {
public static void main(String[] args) {
// インスタンスを生成
Calendar cal = Calendar.getInstance();
// 指定日時をセット 2017/1/1 22:30:10
// 注:月は0から始まり、11で終わる
cal.set(2017,0,1,22,30,10);
// 指定した日時の1日前を求める
cal.add(Calendar.DATE, -1);
// 日時の取得
int d1 = cal.get(Calendar.YEAR);
int d2 = cal.get(Calendar.MONTH) + 1; //月は0~11なので1を足す
int d3 = cal.get(Calendar.DATE);
int d4 = cal.get(Calendar.HOUR_OF_DAY);
int d5 = cal.get(Calendar.MINUTE);
int d6 = cal.get(Calendar.SECOND);
// 結果 2016/12/31 22:30:10
System.out.println(d1 + "/" + d2 + "/" + d3 +
" " + d4 + ":"+ d5 + ":"+ d6);
}
}
16行目のaddメソッドで1日前を求めています。
Calendarクラスで3時間後を求める
Calendarクラスで3時間後を求めるサンプルです。
2016年12月31日 22:30:10の3時間後を求めます。
package test1;
import java.util.Calendar;
public class Test1 {
public static void main(String[] args) {
// インスタンスを生成
Calendar cal = Calendar.getInstance();
// 指定日時をセット 2016/12/31 22:30:10
// 注:月は0から始まり、11で終わる
cal.set(2016,11,31,22,30,10);
// 指定した日時の3時間後を求める
cal.add(Calendar.HOUR_OF_DAY, 3);
// 日時の取得
int d1 = cal.get(Calendar.YEAR);
int d2 = cal.get(Calendar.MONTH) + 1; //月は0~11なので1を足す
int d3 = cal.get(Calendar.DATE);
int d4 = cal.get(Calendar.HOUR_OF_DAY);
int d5 = cal.get(Calendar.MINUTE);
int d6 = cal.get(Calendar.SECOND);
// 結果 2017/1/1 1:30:10
System.out.println(d1 + "/" + d2 + "/" + d3 +
" " + d4 + ":"+ d5 + ":"+ d6);
}
}
16行目のaddメソッドで3時間後を求めています。
Calendarクラス(従来のやり方)
- 日付と時間を扱います。
- Unix時間(1970年1月1日0時0分0秒からの経過時間)をベースにしています。
https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93 - 以下は、Java8 API仕様のCalendarクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Calendar.html
関連の記事