[Swift] Calendar/Date: その月には何日ある?

     
⌛️ < 1 min.

Date で 指定した月の日数を数えてみます。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS15.0.1 Sequoia
  • Xcode 16.1 Beta3
  • iOS 18.1
  • Swift 5.9

Calendar/ Date

Swift では、Foundation に Calendar や Date が用意されています。


参考
CalendarApple Developer Documentation


参考
DateApple Developer Documentation

Calendar と Date の役割分担が勘違いしやすいですが、Date は、カレンダーに影響されない 時間の表現のための型です。
地域によるカレンダーの差異は、Calendar が管理しています。

意味わからないですよね・・・

具体的に書くと、”72時間後” と”3日後の同時刻 “は 同じでないかも知れないということです。

“72時間後” は、Date で計算できますが、
“3日後の同時刻 “は、Calendar なしには計算できません。

なぜなら、世界では”夏時間” を採用している地域もあり、その切り替えが3日以内に行われるケースでは、
3日後の同時刻は、72時間(=24 時間x3) 経過した時刻とおなじであるかわからないからです。

大抵のアプリではおおよそ Gregorian 暦を使用している気がするので、あまりカレンダーを意識しないかも知れません。

月の日数

Calendar なしにわからないものの1つに、”月の日数” があります。

日数を直接返してくるメソッドはありませんが、”指定Component 内で 特定のComponent が持ちえる範囲を返す API ” が用意されているので、そのAPIを使用して取得します。


参考
range(of:in:for:)Apple Developer Documentation

”of: に渡した Componentt” が “in: で渡した Componentt” 内で取り得る範囲を返してきます。

ただし、日数を直接返してくるわけではありませんので、以下のステップで取得することが必要です。

STEP1
Range の取得
range(of:in:for:) を使用して該当月の日付の範囲を取得する
STEP2
Range の大きさ取得
日付のとりえる範囲が分かればあとはその大きさを取得すればそれが日数です

以下では、作成した日付(2024/10/12) の含まれる月の日数を求めています。

import Foundation

let date = Calendar.current.date(from: DateComponents(year: 2024,
                                                      month: 10, day: 12))!

if let dateRange = Calendar.current.range(of: .day, in: .month, for: date) {
    let dayNum = dateRange.count
    print(dayNum)
}
// print-out
"Oct 12, 2024 at 0:00"
31
"31\n"

なお、Gregorio 暦では、2月以外の日数は固定ですので、わざわざ上記の API を使用しなくても良いかも知れません。

2月の日数を計算する時には、この API を利用すれば、うるう年か判定する “西暦を 4、100、400 それぞれで割り切れるかどうかを使って判定する” という手間がなくなります。

MEMO

上記APIを使うのと、3回の剰余計算は どちらを手間に感じるかは人によるかも・・・

Calendar.current.range(of: .day, in: .year, for: date) としてその年の日数を調べることももちろんできます。

まとめ

月の日数を算出する方法を確認しました。

月の日数を算出する方法
  • うるう年の2月以外は、固定値
  • 2月の日数計算は Calendar の用意している API を使用する
  • range(of:in:for:) がそのAPI
  • 西暦の4,100,400 それぞれの剰余からも計算できる

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

SwiftUI おすすめ本

SwiftUI を理解するには、以下の本がおすすめです。

SwiftUI ViewMatery

SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。

英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。

View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です