1. ホーム
  2. ios

[解決済み] 当月の1日および最終日(Swift形式

2023-01-18 04:08:53

質問

swiftで月の初日と最終日を取得しようとしています。

今のところ以下のような感じです。

let dateFormatter = NSDateFormatter()
let date = NSDate()
dateFormatter.dateFormat = "yyyy-MM-dd"
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: date)

let month = components.month
let year = components.year

let startOfMonth = ("\(year)-\(month)-01")

しかし、最後の日付を取得する方法がよくわかりません。私が見逃している組み込みのメソッドがありますか?明らかに、うるう年などを考慮に入れなければなりません。

どのように解決するのですか?

月の初日を取得するには、単純に

let components = calendar.components([.Year, .Month], fromDate: date)
let startOfMonth = calendar.dateFromComponents(components)!
print(dateFormatter.stringFromDate(startOfMonth)) // 2015-11-01

月の最終日を得るには、月を1つ足し、日を1つ引きます。

let comps2 = NSDateComponents()
comps2.month = 1
comps2.day = -1
let endOfMonth = calendar.dateByAddingComponents(comps2, toDate: startOfMonth, options: [])!
print(dateFormatter.stringFromDate(endOfMonth)) // 2015-11-30

あるいは rangeOfUnit メソッドを使うこともできます。 メソッドを使って、月の始まりと長さを得ることもできます。

var startOfMonth : NSDate?
var lengthOfMonth : NSTimeInterval = 0
calendar.rangeOfUnit(.Month, startDate: &startOfMonth, interval: &lengthOfMonth, forDate: date)

月の最終日の日付の場合、月の長さから1秒を引いたものを追加します。

let endOfMonth = startOfMonth!.dateByAddingTimeInterval(lengthOfMonth - 1)

Swift5用に更新しました。

extension Date {
    var startOfDay: Date {
        return Calendar.current.startOfDay(for: self)
    }

    var startOfMonth: Date {

        let calendar = Calendar(identifier: .gregorian)
        let components = calendar.dateComponents([.year, .month], from: self)

        return  calendar.date(from: components)!
    }

    var endOfDay: Date {
        var components = DateComponents()
        components.day = 1
        components.second = -1
        return Calendar.current.date(byAdding: components, to: startOfDay)!
    }

    var endOfMonth: Date {
        var components = DateComponents()
        components.month = 1
        components.second = -1
        return Calendar(identifier: .gregorian).date(byAdding: components, to: startOfMonth)!
    }

    func isMonday() -> Bool {
        let calendar = Calendar(identifier: .gregorian)
        let components = calendar.dateComponents([.weekday], from: self)
        return components.weekday == 2
    }
}