検証環境:
Xcode Version 12.5 (12E262)
Swift 5.4
Swift で、ある月の月初・月末を取得する方法。
月初の取得は1日固定で取得するだけだが、月末の取得は月初から1ヶ月進めて1日戻すことで算出できる。
例1:2020年2月の月初と月末を取得する
let calendar = Calendar(identifier: .gregorian) // 西暦を指定 let firstDay = calendar.date(from: DateComponents(year: 2020, month: 2))! // day: 1 を指定してもよいが省略しても月初となる /* こう書いても同じ var comps = calendar.dateComponents([.year, .month], from: Date()) comps.year = 2020 comps.month = 2 let firstDay = calendar.date(from: comps)! */ let add = DateComponents(month: 1, day: -1) // 月初から1ヶ月進めて1日戻す let lastDay = calendar.date(byAdding: add, to: firstDay)! print("\(firstDay)") // 2020-01-31 15:00:00 +0000 print("\(lastDay)") // 2020-02-28 15:00:00 +0000
print で文字列出力すると GMT(UTC) でわかりづらいので、フォーマッタを用意して JST で文字列出力する。
let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.calendar = Calendar(identifier: .gregorian) // 西暦を指定 // formatter.timeZone = TimeZone(identifier: "Asia/Tokyo") // システムのタイムゾーンが Asia/Tokyo でない場合は指定が必要 formatter.dateFormat = "yyyy-MM-dd" return formatter }() print(dateFormatter.string(from: firstDay)) // 2020-02-01 print(dateFormatter.string(from: lastDay)) // 2020-02-29
例2:今月の月初と月末を取得する
let calendar = Calendar(identifier: .gregorian) // 西暦を指定 let comps = calendar.dateComponents([.year, .month], from: Date()) let firstDay = calendar.date(from: comps)! let add = DateComponents(month: 1, day: -1) let lastDay = calendar.date(byAdding: add, to: firstDay)! print(dateFormatter.string(from: firstDay)) // 2021-07-01 print(dateFormatter.string(from: lastDay)) // 2021-07-31