Вопрос:

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

ios swift swift3 calendar

16414 просмотра

4 ответа

1113 Репутация автора

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

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

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) {

    }

Так как же сделать это за предыдущий и следующий месяц?

Автор: iDeveloper Источник Размещён: 01.10.2016 08:46

Ответы (4)


40 плюса

59739 Репутация автора

Решение

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

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

Свифт 3 и Свифт 4

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: [])

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

Свифт 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()с вашим NSDateобъектом.

Редактировать: Для продолжения путешествий следующих и предыдущих месяцев вам необходимо сохранить один объект даты currentDate, а при попытке получить следующий и предыдущий месяц использовать этот объект даты и обновить его.

На следующий месяц

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

За предыдущий месяц.

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

Вы также можете использовать расширение, которое облегчит задачу.

Свифт 3

extension Date {
    func getNextMonth() -> Date? {
        return Calendar.current.date(byAdding: .month, value: 1, to: self)
    }

    func getPreviousMonth() -> Date? {
        return Calendar.current.date(byAdding: .month, value: -1, to: self)
    }
}

Swift 2.3 или ниже

extension NSDate {
    func getNextMonth() -> NSDate?{
        return NSCalendar.currentCalendar().dateByAddingUnit(.Month, value: 1, toDate: self, options: [])
    }

    func getPreviousMonth() -> NSDate?{
        return NSCalendar.currentCalendar().dateByAddingUnit(.Month, value: -1, toDate: self, options: [])
    }
}

Теперь просто получить дату от currentDate.

currentDate = currentDate.getNextMonth()
currentDate = currentDate.getPreviousMonth()
Автор: Nirav D Размещён: 01.10.2016 08:58

2 плюса

8162 Репутация автора

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
Автор: Tikhonov Alexander Размещён: 01.10.2016 09:10

0 плюса

3036 Репутация автора

Я бы порекомендовал использовать библиотеку 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и многие другие полезные методы.

Автор: algrid Размещён: 03.03.2018 12:01

0 плюса

746 Репутация автора

Swift 5

let date = Date()
let calendar = Calendar.current
let currentYear = Calendar.current.component(.year, from: Date())
let previousYear = currentYear + 1
let nextYear = currentYear + 1
print("\(previousYear)->\(currentYear)->\(nextYear)")

Output:
2018->2019->2020

Удачного кодирования :)

Автор: Ariven Nadar Размещён: 08.11.2019 09:05
Вопросы из категории :
32x32