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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア7901
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/03/06 07:14