📅

kotlinで月の日数を取得する

2021/04/09に公開

概要

LocalDate型の日付"2021-04-05"に対して、その月の総日数を出力したい場合。
lengthOfMonthメソッドを使用して取得することができる。

ドキュメントを参照してみる

https://developer.android.com/reference/kotlin/java/time/LocalDate#lengthOfMonth()

使い方

LocalDate型に対して使用する。戻り値はInt

val lengthOfMonth = LocalDate.now().lengthOfMonth()
println(lengthOfMonth)

> 出力
> 20212月の場合・・・29
> 20202月の場合・・・28

LocalDateクラス内で、lengthOfMonthの仕組みを覗いてみる

public final class LocalDate implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable {
    public static final LocalDate MIN = of(-999999999, 1, 1);
    public static final LocalDate MAX = of(999999999, 12, 31);
    public static final LocalDate EPOCH = of(1970, 1, 1);
    private static final long serialVersionUID = 2942565459149668126L;
    private static final int DAYS_PER_CYCLE = 146097;
    static final long DAYS_0000_TO_1970 = 719528L;
    private final int year;
    private final short month;
    private final short day;
    
    // おなじみの今日の日付
    public static LocalDate now() {
        return now(Clock.systemDefaultZone());
    }
    // 今回のメソッド。
    public int lengthOfMonth() {
        switch(this.month) {
        case 2:
            return this.isLeapYear() ? 29 : 28;
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        default:
            return 31;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
        }
    }
    // 其の年の日数を返してくれるメソッド。うるう年かそうでないかで、戻り値が変わる。
    public int lengthOfYear() {
        return this.isLeapYear() ? 366 : 365;
    }
}

lengthOfMonthメソッド

  public int lengthOfMonth() {
        switch(this.month) {
        case 2:
            return this.isLeapYear() ? 29 : 28;
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        default:
            return 31;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
        }
    }

switch文内で月12を受け取り、月ごとに返却する値を30か31か分岐させている。
2月はうるう年があるので特殊。

Discussion