【Kotlin/Android】Calendarクラスの使い方!日付の比較や操作、曜日の取得方法

この記事からわかること

  • Android Studio/KotlinCalendarクラス使い方
  • 日付時刻比較操作方法
  • 曜日などを取得するには?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

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月=02月=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

指定できるTimeZoneIDgetAvailableIDsメソッドを使用することで一覧を取得することができます。

val availableTimeZones = TimeZone.getAvailableIDs()
availableTimeZones.forEach { println(it) }

主要なTimeZoneID

曜日を取得する

曜日を取得するには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は同じ日付です。")
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index