2016-10-01 12 views
6

Próbuję uzyskać poprzedni i przyszły miesiąc przez kliknięcie przycisku, ale zmieniło to mój rok, a nie miesiąc.Jak uzyskać poprzedni i następny miesiąc w kalendarzu

Próbuję go za pomocą this link, ale jest w 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) { 

    } 

Jak to zrobić zarówno w poprzednim, jak iw przyszłym miesiącu?

Odpowiedz

16

Spróbuj tego.

Aby uzyskać datę następnego miesiąca.

Swift 3

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

Swift 2.3 lub niższy

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

Aby uzyskać datę poprzedniego miesiąca.

Swift 3

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

Swift 2.3 lub niższy

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

Uwaga: Aby uzyskać datę następnego i poprzedniego miesiąca użyłem datę dzisiejszą, można użyć datę, od której chcesz wprowadzić datę następnego i poprzedniego miesiąca, po prostu zmień NSDate() na swoją NSDate obiekt.

Edit: Dla kontynuuje podróżowanie z następnych i poprzednich miesiącach trzeba przechowywać jeden obiekt Date CurrentDate a kiedy próbują dostać następny i poprzedni miesiąc użycie że data obiektu i jego aktualizacji.

Na następny miesiąc.

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

Na poprzednim miesiącu.

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

Można również użyć rozszerzenia, które uczynią rzecz łatwa.

Swift 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 lub niższy

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

Teraz po prostu datę z CurrentDate.

currentDate = currentDate.getNextMonth() 
currentDate = currentDate.getPreviousMonth() 
+0

Swift 3 wersja? Wydaje się, że '' dateByAddingUnit'' został zastąpiony przez '' Calendar.current.date (przez dodanie: .day, value: days, to: date)! '' Chociaż, nie mogę już znaleźć opcji? – eonist

+0

Swift 3.0.2, NSCalendar.current.date (przez dodanie:. Miesiąc, wartość: 1, do: daty) – KTPATEL

+0

** Jak obsłużyć zasięg w swift3 **. 'calendar.range (.Month, startDate: & startOfMonth, interval: & lengthOfMonth, forDate: date)'. ** Błąd jest> Dodatkowy argument "forDate" w wywołaniu ** – iDeveloper

2
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 
+0

Idealne dla następnych miesięcy. co z poprzednim miesiącem – iDeveloper

+0

@iDeveloper po prostu zmień 'wartość' w funkcji na' -1' –

+0

dzięki pracy perfect – iDeveloper

0

polecam korzystania SwiftDate bibliotekę:

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

Można użyć .start i .end zamiast .auto. Spójrz na informacje o nextMonth na przykład:

gdy .auto oceniano data jest obliczana przez dodanie jednego miesiąca do daty bieżącej.

Jeśli przejdziesz .start datą końcową pierwszego dnia następnego miesiąca (o 00:00:00).

Jeśli przejdziesz .end datą końcową, będzie ostatni dzień następnego miesiąca (o 23:59:59).

Biblioteka zawiera także prevWeek/nextWeek i wiele innych użytecznych metod.

Powiązane problemy