質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1434閲覧

Calendar.current.range()の戻り値

退会済みユーザー

退会済みユーザー

総合スコア0

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/02/29 08:02

Swift

1Calendar.current.range(of: .weekOfMonth, in: .month, for: components)

これの戻り値はなんですか?
appleのドキュメントも見たのですがよくわかりませんでした。

ドキュメントの内容
Returns the range of absolute time values that a smaller calendar component (such as a day) can take on in a larger calendar component (such as a month) that includes a specified absolute time.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

最後の引数は日付で、これは「date を含む月の weekOfMonth の範囲はどこからどこまでか」を返します。

swift

1Calendar.current.range(of: .weekOfMonth, in: .month, for: date)

まず、わかりやすい例として of: .day, in: .month の場合を考えます。

swift

1import Foundation 2 3func d(_ str: String) -> Date { 4 let f = DateFormatter() 5 f.locale = Locale(identifier: "en_US_POSIX") 6 f.dateFormat = "yyyy/MM/dd" 7 return f.date(from: str)! 8} 9 10print(Calendar.current.range(of: .day, in: .month, for: d("2019/02/01"))!) 11print(Calendar.current.range(of: .day, in: .month, for: d("2020/02/01"))!) 12print(Calendar.current.range(of: .day, in: .month, for: d("2020/03/01"))!) 13print(Calendar.current.range(of: .day, in: .month, for: d("2020/04/01"))!)

それぞれ 1..<29, 1..<30, 1..<32, 1..<31 と表示します。
これは、2019年2月の範囲は1〜28日、2020年2月はうるう年なので1〜29日、3月は1〜31日、4月は1〜30日という意味です。(..< なので最後の数字は含まないことに注意。)


次に、本題の of: .weekOfMonth, in: .month の場合ですが、

swift

1print(Calendar.current.range(of: .weekOfMonth, in: .month, for: d("2020/03/01"))!) 2print(Calendar.current.range(of: .weekOfMonth, in: .month, for: d("2020/05/01"))!)

の結果は 1..<6, 1..<7 となります。これは以下のように考えられます。

March 2020 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 ... 第1週 8 9 10 11 12 13 14 ... 第2週 15 16 17 18 19 20 21 ... 第3週 22 23 24 25 26 27 28 ... 第4週 29 30 31 ... 第5週 May 2020 Su Mo Tu We Th Fr Sa 1 2 ... 第1週 3 4 5 6 7 8 9 ... 第2週 10 11 12 13 14 15 16 ... 第3週 17 18 19 20 21 22 23 ... 第4週 24 25 26 27 28 29 30 ... 第5週 31 ... 第6週

また、うるう年でない年の2月は28日(つまり4週間)ですが、

swift

1print(Calendar.current.range(of: .weekOfMonth, in: .month, for: d("2015/02/01"))!) 2print(Calendar.current.range(of: .weekOfMonth, in: .month, for: d("2019/02/01"))!)

の結果は 1..<5, 1..<6 となります。

February 2015 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 ... 第1週 8 9 10 11 12 13 14 ... 第2週 15 16 17 18 19 20 21 ... 第3週 22 23 24 25 26 27 28 ... 第4週 February 2019 Su Mo Tu We Th Fr Sa 1 2 ... 第1週 3 4 5 6 7 8 9 ... 第2週 10 11 12 13 14 15 16 ... 第3週 17 18 19 20 21 22 23 ... 第4週 24 25 26 27 28 ... 第5週

また、週の初めの日によっても変わります。今までは日曜日でしたが、これを月曜日に変更すると、

swift

1var cal = Calendar.current 2cal.firstWeekday = 2 3print(cal.range(of: .weekOfMonth, in: .month, for: d("2020/03/01"))!)

の結果は 1..<7 となります。

March 2020 Mo Tu We Th Fr Sa Su 1 ... 第1週 2 3 4 5 6 7 8 ... 第2週 9 10 11 12 13 14 15 ... 第3週 16 17 18 19 20 21 22 ... 第4週 23 24 25 26 27 28 29 ... 第5週 30 31 ... 第6週

さらに、of: .day, in: .weekOfMonth とするとその週が何日から何日までかを返します。

swift

1print(Calendar.current.range(of: .day, in: .weekOfMonth, for: d("2020/01/01"))!) 2print(Calendar.current.range(of: .day, in: .weekOfMonth, for: d("2020/01/05"))!) 3print(Calendar.current.range(of: .day, in: .weekOfMonth, for: d("2020/01/31"))!)

はそれぞれ 1..<5, 5..<12, 26..<32 と表示します。

January 2020 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

投稿2020/03/02 21:17

編集2020/03/06 07:18
hoshi-takanori

総合スコア7901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/06 07:14

ものすごく丁寧にありがとうございましたm(__)m おかげさまで理解できました! ※返信遅れてすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問