【Kotlin/Android】Calendarクラスの使い方!日付の比較や操作、曜日の取得方法
この記事からわかること
- Android Studio/KotlinでCalendarクラスの使い方
- 日付や時刻の比較や操作方法
- 曜日や月などを取得するには?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Calendarクラスとは?
AndroidのCalendar
クラスは日付と時刻を操作するためのJavaのクラスです。日付や時刻の加算や比較、曜日や月の取得などさまざまな機能を提供してくれています。
import java.util.Calendar
Androidでは日付に関するクラスが他にもあるので以下の記事を参考にしてください。
現在の日付のCalendarインスタンスを取得する
Calendar
インスタンスは日付情報を保持しています。getInstance
メソッドを使用することで現在日時のCalendarインスタンスを取得することができます。
// 現在の日付と時刻を保持するインスタンスを取得
val c = Calendar.getInstance()
生成したCalendar
インスタンスを出力すると以下のようになります。内部的にUNIXタイムやTimeZone、曜日情報、日時1つ1つの情報を保持していることが確認できます。
java.util.GregorianCalendar[time=1714824725299,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2024,MONTH=4,WEEK_OF_YEAR=18,WEEK_OF_MONTH=1,DAY_OF_MONTH=4,DAY_OF_YEAR=125,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=12,SECOND=5,MILLISECOND=299,ZONE_OFFSET=0,DST_OFFSET=0]
日時を1つずつ取得する
get
メソッドの引数にCalendar.対象
を渡すことで日時情報を1つ1つ取得することが可能です。1月=0
、2月=1
という数え方になっているので月のみ1ヶ月少ない数値が返ってきます。+1
することで実際の月に合わせる必要があります。
val c = Calendar.getInstance()
val year = c.get(Calendar.YEAR)
val month = c.get(Calendar.MONTH)
val day = c.get(Calendar.DAY_OF_MONTH)
val hour = c.get(Calendar.HOUR_OF_DAY)
val minute = c.get(Calendar.MINUTE)
val second = c.get(Calendar.SECOND)
print(year) // 2024
print(month + 1 ) // 5
print(day) // 9
print(hour) // 21
print(minute) // 10
print(second) // 17
タイムゾーンを変更する
Calendar
クラスは内部にTimeZoneを持っており、設定されているTimeZoneに応じて取得する日付なども変化します。タイムゾーンを明示的に変更するにはtimeZone
プロパティにTimeZone
型を渡します。
val c = Calendar.getInstance()
val timeZone = TimeZone.getTimeZone("Asia/Tokyo") // 例: 日本時間
c.timeZone = timeZone
val year = c.get(Calendar.YEAR)
val month = c.get(Calendar.MONTH)
val day = c.get(Calendar.DAY_OF_MONTH)
val hour = c.get(Calendar.HOUR_OF_DAY)
val minute = c.get(Calendar.MINUTE)
val second = c.get(Calendar.SECOND)
print(year) // 2024
print(month + 1 ) // 5
print(day) // 9
print(hour) // 21
print(minute) // 10
print(second) // 17
日本時間を指定すれば日本時間の日付が取得でき、UTC
にすればUTCでの日付(-9時間ずれた値)が取得できるようになります。
val timeZone = TimeZone.getTimeZone("UTC") // 例: UTCに変更
c.timeZone = timeZone
val year = c.get(Calendar.YEAR)
val month = c.get(Calendar.MONTH)
val day = c.get(Calendar.DAY_OF_MONTH)
val hour = c.get(Calendar.HOUR_OF_DAY)
val minute = c.get(Calendar.MINUTE)
val second = c.get(Calendar.SECOND)
print(year) // 2024
print(month + 1 ) // 5
print(day) // 9
print(hour) // 12
print(minute) // 10
print(second) // 17
指定できるTimeZoneID
指定できるTimeZoneID
はgetAvailableIDs
メソッドを使用することで一覧を取得することができます。
val availableTimeZones = TimeZone.getAvailableIDs()
availableTimeZones.forEach { println(it) }
主要なTimeZoneID
- UTC
- Asia/Tokyo
曜日を取得する
曜日を取得するにはget
メソッドの引数にCalendar.DAY_OF_WEEK
を渡します。
val c = Calendar.getInstance()
// 曜日の取得
val dayOfWeek = c.get(Calendar.DAY_OF_WEEK)
// DAY_OF_WEEK の値から曜日を取得
val dayOfWeekString = when (dayOfWeek) {
Calendar.SUNDAY -> "日曜日"
Calendar.MONDAY -> "月曜日"
Calendar.TUESDAY -> "火曜日"
Calendar.WEDNESDAY -> "水曜日"
Calendar.THURSDAY -> "木曜日"
Calendar.FRIDAY -> "金曜日"
Calendar.SATURDAY -> "土曜日"
else -> "不明な曜日"
}
日時の加算/減算
日時の加算/減算をするにはadd
メソッドの引数にCalendar.対象
を渡し、加算/減算したい数を渡します。負数を渡せば減算することができます。
// 5日後
c.add(Calendar.DATE, 5)
// 5時間前
c.add(Calendar.HOUR, -5)
任意の日時のCalendarインスタンスを作成する
任意の日付Date
型をCalendar
に変換したい場合はtime
プロパティにDate
型の値をそのまま格納すればOKです。
val date = Date()
val c = Calendar.getInstance()
c.time = date
同じ日付かどうか比較する
同じ日付かどうか比較するにはcompareTo
メソッドを使用します。前後かどうかを知りたい場合はbefore
/after
メソッドを使用します。。
val calendar1 = Calendar.getInstance()
val calendar2 = Calendar.getInstance()
// calendar1がcalendar2よりも後の場合
if (calendar1.after(calendar2)) {
println("calendar1はcalendar2よりも後です。")
}
// calendar1がcalendar2よりも前の場合
if (calendar1.before(calendar2)) {
println("calendar1はcalendar2よりも前です。")
}
// calendar1とcalendar2が同じ日付の場合
if (calendar1.compareTo(calendar2) == 0) {
println("calendar1とcalendar2は同じ日付です。")
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。