Как получить предыдущий и следующий месяц

Я пытаюсь получить предыдущий и следующий месяц, если нажать на кнопку, но это изменило мой год, а не месяц.

Я пытаюсь использовать этой ссылке но это в Objective-С.

func firstDateOfMonth(){

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

    }
    func lastDateOfMonth(){

        let components = calendar.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: date)

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

        let startOfMonth1 = ("01-(month)-(year)")


        var startOfMonth : NSDate?
        var lengthOfMonth : NSTimeInterval = 0
        calendar.rangeOfUnit(.Month, startDate: &startOfMonth, interval: &lengthOfMonth, forDate: date)
        let endOfMonth = startOfMonth!.dateByAddingTimeInterval(lengthOfMonth - 1)
        print(dateFormatatter.stringFromDate(endOfMonth))
    }

    func monthCalculation(){
        firstDateOfMonth()
        lastDateOfMonth()
    }

    @IBAction func previousMonthBtnAction(sender: AnyObject) {

        let componen = calendar.components([.Day , .Month , .Year], fromDate: date)
        componen.month = -1
        self.date = calendar.dateFromComponents(componen)!
        print(self.date)
    }

    @IBAction func nextMonthBtnAction(sender: AnyObject) {

    }

Итак, как это сделать как в предыдущем, так и в следующем месяце?

3 ответов


попробуйте вот так.

чтобы получить дату следующего месяца.

Swift 3

let nextMonth = Calendar.current.date(byAdding: .month, value: 1, to: Date())

Swift 2.3 или ниже

let nextMonth = NSCalendar.currentCalendar().dateByAddingUnit(.Month, value: 1, toDate: NSDate(), options: [])

чтобы получить дату предыдущего месяца.

Swift 3

let previousMonth = Calendar.current.date(byAdding: .month, value: -1, to: Date())

Swift 2.3 или ниже

let previousMonth = NSCalendar.currentCalendar().dateByAddingUnit(.Month, value: -1, toDate: NSDate(), options: [])

Примечание: для получение следующего и предыдущего месяца я использовал сегодняшняя дата, вы можете использовать дату, с которой вы хотите следующую и предыдущую дату месяца, просто измените NSDate() С


var currentDate = NSDate()

func nextMonth() -> NSDate {
    let nextDate = NSCalendar.currentCalendar().dateByAddingUnit(.Month, value: 1, toDate: currentDate, options: [])!
    currentDate = nextDate
    return nextDate
}

print(nextMonth()) // 2016-11-01 20:11:15 +0000
print(nextMonth()) // 2016-12-01 21:11:15 +0000
print(nextMonth()) // 2017-01-01 21:11:15 +0000

Я бы посоветовал использовать SwiftDate библиотека:

let date = Date()
let nextMonthDate = date.nextMonth(at: .auto)
let prevMonthDate = date.prevMonth(at: .auto)

можно использовать .start и .end вместо .auto. Посмотрите на информацию о nextMonth например:

, когда .auto оцененная дата рассчитывается путем добавления одного месяца к текущей дате.

если вы передадите .start дата результат первого дня следующего месяца (в 00:00:00).

если вы передадите .end дата результата-последний день в следующем месяце (в 23:59:59).

библиотека также содержит prevWeek/nextWeek и многие другие полезные методы.