xyk blog

最近は iOS 開発の記事が多めです。

Swift で月初・月末を取得する

検証環境:
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