Kotlinの日時を計算するサンプルです。加算と減算を行います。
目次
計算 | LocalDateTimeクラスで日時を計算する |
Calendarクラスで日時を計算する |
LocalDateTimeクラスで日時を計算する
LocalDateTimeクラスで日時を計算するサンプルです。
import java.time.format.DateTimeFormatter
import java.time.LocalDateTime
fun main(args: Array<String>) {
// 指定日時をセット 2021/12/05 22:30:10
val ldt1 = LocalDateTime.of(2021, 12, 5, 22, 30, 10)
//2年後を求める
val date1 = ldt1.plusYears(2)
println(date1) //2023-12-05T22:30:10
//2ヶ月後を求める
val date2 = ldt1.plusMonths(2)
println(date2) //2022-02-05T22:30:10
//2日前を求める
val date3 = ldt1.minusDays(2)
println(date3) //2021-12-03T22:30:10
//2時間20分20秒後を求める
val date4 = ldt1.plusHours(2).plusMinutes(20).plusSeconds(20)
println(date4) //2021-12-06T00:50:30
// String型+表示形式を指定する
val dtFormat = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")
val fDate4 = date4.format(dtFormat)
println(fDate4) // 2021/12/06 00:50:30
}
7行目は、LocalDateTimeクラスのofメソッドで年月日と時分秒を指定しています。
指定日時の引数の月は、-1する必要がありません。(Calendarクラスでは月を-1する必要があります)
10,14,22行目のメソッドは、足し算を意味するplus***という名称になっています。
18行目のメソッドは、引き算を意味するminus***という名称になっています。
26行目は、DateTimeFormatterクラスで表示形式をyyyy/mm/dd形式に変換しています。
27行目は、指定した表示形式に変換しています。
計算のメソッド
以下は、LocalDateTimeクラスの主な計算のメソッドです。
意味 | メソッド |
---|---|
年 | plusYears/minusYears |
月 | plusMonths/minusMonths |
日 | plusDays/minusDays |
時 | plusHours/minusHours |
分 | plusMinutes/minusMinutes |
秒 | plusSeconds/minusSeconds |
LocalDateTimeクラス
- タイムゾーンのない日付/時間を扱います。
- イミュータブルかつスレッドセーフです。
- Java8で導入されたクラスです。import先はjava.time~になっています。
- 以下は、Java8 API仕様のLocalDateTimeクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDateTime.html
イミュータブル
- インスタンスを作成した後、そのインスタンスの状態が変わらないことです。
- 日付を加算をしても元のインスタンスは変わらず新しいインスタンスを返します。
- Calendarクラスのインスタンスは状態が変わります。→ミュータブルです。
スレッドセーフ
- 複数のスレッドが同時に実行しても大丈夫です。
Calendarクラスで日時を計算する
Calendarクラスで日時を計算するサンプルです。
2021年12月05日 22:30:10の2日後を求めます。
import java.text.SimpleDateFormat
import java.util.Calendar
fun main(args: Array<String>) {
// インスタンスを生成
val cal1 = Calendar.getInstance()
// 指定日時をセット 2021/12/5 22:30:10
cal1[2021, 11, 5, 22, 30] = 10
// 指定した日時の2日後を求める
cal1.add(Calendar.DATE, 2)
// Date型に変換
val date1 = cal1.time
println(date1) //Tue Dec 07 22:30:10 JST 2021
// 表示形式を指定
val sdformat = SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
val fdate1 = sdformat.format(date1)
println(fdate1) // 2021/12/07 22:30:10
}
6行目は、カレンダークラスのインスタンスを生成しています。
9行目は、計算元の日時を指定しています。注意点として、月は0から始まるという仕様になっています。そのため12月にしたい場合は11を指定します。
12行目は、指定した日時の2日後を求めています。
15行目は、Date型に変換しています。
19行目の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で導入されたクラスです。import先はjava.time~になっています。
以下は、Java8 API仕様のCalendarクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Calendar.html
関連の記事