【Swift】Calendarの使い方

Calenderは主に日付と時間の計算を行う際に使用する構造体です。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】11.4.1
【Swift】5.2
【iOS】13.4.1
【macOS】Catalina バージョン 10.15.4
スポンサーリンク

日時計算は難しい

1分は60秒、1時間は60分、1日は24時間、1年は365日のように誰もが知っている法則を使えば、日時計算はそれほど難しくないように思えます。
でも、実は例外パターンがいくつもあります。

  • 4年に1回訪れる「うるう年」は、1年が366日です。しかも厳密には4年に1回ではなかったりします。
  • 同じように、何年かおきに「うるう秒」といって1分が61秒になる瞬間があります。
  • 海外等で採用されている、夏時間(サマータイム)の切り替わりタイミングでは1日が24時間では無い日が存在します。

日時計算を正確に行うには、このような例外パターンを全て考慮する必要がありますので、独自でロジックを組むのはとても大変です。

Calendar構造体を使うと、これらの例外を考慮した日時計算が可能です。

スポンサーリンク

Date構造体を生成する

特定の日時を示すDate構造体を生成するのには、Calendarのdateメソッドを使用します。

Calendar.date()メソッドの引数fromには、DateComponents構造体を使って生成する日時の要素を指定します。

スポンサーリンク

日時の加算/減算

Calendar構造体を使って日時の加算/減算を行う例です。
対象となる基準日時をDate構造体、加算する日時の要素はDateComponents構造体で示します。
DateComponentsの各要素をマイナス値にすると減算処理となります。

スポンサーリンク

Calendar構造体の生成

Calendar構造体の生成時には、次のように適用するカレンダー(暦法)を指定する必要があります。
よほど特別な理由が無い限り西暦カレンダー(.gregorian)を指定しておけば問題無いでしょう。

適用カレンダーを変えるとどうなるのか?

適用するカレンダーを変えると、日付の扱いが変わります。

次のコードは、2種類のDate構造体を生成する例ですが、採用するカレンダーによって生成される日付が異なるのがわかります。
同じ2020年でも和暦の場合は令和2020年(=西暦4038年)と解釈されています。

利用可能なカレンダー

利用可能なカレンダーは以下の通りです。
Calendar.Identifier(enum型)で定義されています。

Identifier カレンダー(暦法)
gregorian グレゴリオ暦、西暦(ヨーロッパ、西半球などの一般的なカレンダー)
japanese 和暦(元号を使った日本の暦法)
iso8601 ISO8601規格(日付と時刻に関するISO国際規格)
hebrew ユダヤ暦(ヘブライ暦)
chinese 中国暦(中国の旧暦)
republicOfChina 中華民国(台湾)で使われている暦法
buddhist タイ仏暦(東南アジアの仏教徒の多い国などで用いらる)
coptic コプト暦(エジプトで用いられた太陽暦)
ethiopicAmeteAlem エチオピア暦(Amete Alem)
ethiopicAmeteMihret エチオピア暦(Amete Mihret)
indian インド暦(ヒンズー暦、インドの伝統的な暦法)
islamic イスラム暦(イスラム教社会で使われている暦法)
islamicCivil イスラム暦(常用)
islamicTabular イスラム暦(表計算)
islamicUmmAlQura ウンム・アルクラー暦(サウジアラビアの公式暦)
persian ペルシャ歴(イランを中心に中東で浸かられている暦法)
スポンサーリンク

iPhone端末でのカレンダー(暦法)設定

iPhone端末では「設定」>「一般 」>「言語と地域」 >「 暦法」で、確認・設定可能です。
手元のiPhoneで確認すると、西暦(グレゴリオ暦)、和暦、タイ仏暦 の3種しか選択できないようです。

iPhone端末でのカレンダー(暦法)設定

なお、ここで設定したカレンダーは全てのアプリに適用されるわけではありません。
あくまで適用されるのはカレンダーの変更に対応しているアプリのみです。

端末のカレンダー情報を取得する

ユーザー端末のカレンダー情報は、次の方法で取得可能です。
アプリからは、情報の取得のみ可能で、端末のカレンダー情報の変更はできません。

スポンサーリンク

あわせて読みたい記事

【Swift】日付と時間を扱うクラス/構造体まとめ
Swiftでは日付と時間を扱う為にクラスや構造体がいくつか用意されており、組み合わせて使用します。本記事ではそれらのクラス/構造体を紹介します。
【Swift】Dateの使い方
Dateはカレンダーやタイムゾーンに依存しない「特定の時点」を示す構造体です。単体で日時の比較や、時間間隔の計算等が可能ですが、夏時間、閏年、うるう秒、暦法(ユリウス暦やグレゴレオ歴等)等は考慮されませんので、正確に算出する為にはCal...
【Swift】TimeZoneの使い方
TimeZoneはタイムゾーン(標準時間帯)情報を保持する構造体です。タイムゾーンはある地域での標準時間を表す指標で、GMT(グリニッジ標準時)との時差で表します。日本の標準時間である日本標準時(JST)はGMT+9時間で定義されていま...
【Swift】Localeの使い方
Localeは、言語と地域を組み合わせたロケール情報を保持する構造体です。日付や時間、金額、数値等の書式の決定に影響します。
【Swift】DateFormatterの使い方
日付と時間の書式を定義するクラスです。Date構造体←→テキストの相互変換に使います。