【Swift】曜日と週に関するまとめ

Swiftにおける曜日と週の扱い方を解説します。

スポンサーリンク

環境

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

【Xcode】13.4
【Swift】5.6.1
【iOS】15.5
【macOS】Monterey バージョン 12.3
スポンサーリンク

曜日の取得方法

Dateから曜日を取得するにはCalendar構造体のcomponentメソッドを使用します。

【引数】
第一引数(component)
取得する要素として「曜日」を示す、.weekdayを指定します。

from
曜日を取得したい対象日をDate型で指定します。

【戻り値】
曜日を示すInt型の識別子を返します。(1〜7、1=日曜日)

曜日名の取得

曜日名(文字列)の一覧はCalendar構造体のプロパティから取得します。

【戻り値】
曜日名を示す文字列の配列を返します。
文字列の表記はCalendar.localeの「言語」に依存します。
例えば、
localeが"en_US"の場合は["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]が
"ja_JP"の場合は["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]が返ります。

使用例

特定の日付の曜日名を返すサンプルコードです。

スポンサーリンク

週の考え方

週の開始日について

一週間は何曜日から始まるのでしょうか?
日本の一般的なカレンダーは日曜日から始まっているものが多いですが、業界や会社によっては月曜日始まりのカレンダーが採用されているケースが少なくありません。
ビジネス手帳などでも日曜始まりのものと月曜日始まりのものがあります。

また、地域によっても違いがあり、フランスやドイツなどのヨーロッパでは月曜日始まり、イスラム圏では土曜日始まりの国もあるようです。

週番号について

第n週目などと表す週番号についても地域によって数え方が変わります。
日本では通常各月の1日目が含まれる週を第1週目とカウントしますが、ヨーロッパ等では最初の木曜日を含む週を第1週目とカウントします。

例えば、次に示す2022年7月のカレンダーを見ると、1日目は金曜日から始まっています。
日本では7/1を含む週が第1週目とカウントしますが、ヨーロッパでは2行目の7/4から始まる週がその月の第1週目とカウントします。
そして、7/1〜7/3の週は、ヨーロッパでは7月の第0週目になります。
UntitledImage

年間の週番号の考え方は、また少し異なります。
2022年1月は、以下のように土曜日から始まっていますが、日本では1/1を含む週を2022年の第1週目とカウントします。
対してヨーロッパでは2行目の1/3から始まる週をその年の第1週目とカウントし、1/1〜1/2は2021年の最終週(=52週目)とカウントします。
UntitledImage

国際規格(ISO8601)

日付と時刻の表記に関する国際規格(ISO8601)では週に関して次のように定義されています。
・週の始まりは月曜日。
・最初の木曜日を含む週をその年の第1週とする。

先の例でいくとヨーロッパなどの地域は、国際規格に準じているのがわかります。

スポンサーリンク

Swiftでの週の定義

前述のように週の考え方は地域や業界などによって、方式が異なりますが、Swiftでは状況に合わせて柔軟に方式を変更できる仕組みになっています。
具体的には、日付と時間の計算を行うCalendar構造体に次のプロパティで定義します。

Calendar.firstWeekday
カレンダーの最初の曜日を示します。(1〜7、1=日曜日)
日本やアメリカでは1(日曜日)、ヨーロッパ式では2(月曜日)になります。

Calendar.minimumDaysInFirstWeek
最初の週の最小日数を示します。
日本やアメリカでは1、ヨーロッパ式では4になります。

各項目はCalendar.localeを変更すると自動的に初期値が設定されます。
値は後から個別に変更できますが、週の定義をカスタムで変更する場合の注意点で説明するような注意が必要です。

週番号の取得方法

Dateから週番号を取得するにはCalendar構造体のcomponentメソッドを使用します。

【引数】
第一引数(component)
月単位の週番号を取得する場合は.weekOfMonthを、年単位の週番号を取得する場合は.weekOfYearを指定します。

from
曜日を取得したい対象日をDate型で指定します。

【戻り値】
週番号を示すInt型の識別子を返します。

年単位週番号の基準年(yearForWeekOfYear)

週番号についてで解説したように、地域によって年単位の週番号が変わります。
日本やアメリカでは2022年1月1日は2022年の1週目ですが、ヨーロッパでは2021年の52週目になります。
つまり年単位週番号の基準となる年が実際の年とは異なるケースがあるわけです。

この基準年を取得するには識別子.yearForWeekOfYearを使用します。

【引数】
第一引数(component)
年単位週番号(.weekOfYear)の基準年を示す.yearForWeekOfYearを指定します。

from
曜日を取得したい対象日をDate型で指定します。

【戻り値】
年単位週番号の基準年をInt型で返します。

使用例

対象の地域によって各プロパティが変わるのが確認できます。

出力結果

国際規格(ISO8601)に準拠する

Calendar生成時に、iso8601を指定すると国際規格に準拠したプロパティ(firstWeekday = 2, minimumDaysInFirstWeek = 4)が初期値として設定されます。
この時、カスタムで個別の変更は可能ですが、Localeを設定し直すと設定した地域に関係なく再び初期値(国際規格)に戻ります。

出力結果

週の定義をカスタムで変更する場合の注意点

Calendar.firstWeekdayとCalendar.minimumDaysInFirstWeekへの値設定で、週の定義を任意に変更できます。

注意点として、Calendar.firstWeekdayを設定した後に、必ずCalendar.minimumDaysInFirstWeekも値を設定し直してください。
下記例のように、Calendar.firstWeekdayのみに値を設定、あるいは設定の順番を逆にした場合、週番号が正しく算出されません。
理由は不明ですが、おそらくなんらかのバグと思われます。

出力結果

スポンサーリンク

あわせて読みたい記事

【Swift】Calendarの使い方
Calenderは主に日付と時間の計算を行う際に使用する構造体です。
【Swift】Dateの使い方
(2022/05/19 更新) Dateはカレンダーやタイムゾーンに依存しない「特定の時点」を示す構造体です。 単体で日時の比較や、時間間隔の計算等が可能ですが、夏時間、閏年、うるう秒、暦法(ユリウス暦やグレゴレオ歴等)等は考慮されませんの...
【Swift】Localeの使い方
Localeは、言語と地域を組み合わせたロケール情報を保持する構造体です。 日付や時間、金額、数値等の書式の決定に影響します。
swift
スポンサーリンク