如何获取日历中的前一个和下一个月

问题描述:

我想通过点击按钮获取前一个和下一个月,但这改变了我的一年,而不是一个月。如何获取日历中的前一个和下一个月

我正在尝试使用this link,但它在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) { 

    } 

那么上一个和下个月如何做?

请尝试这样。

获取下个月的日期。

斯威夫特3

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

雨燕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()) 

雨燕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) 
    } 
} 

雨燕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() 
+0

Swift 3版本? ''dateByAddingUnit''似乎已被替换为:''Calendar.current.date(byAdding:.day,value:days,to:date)!''虽然我找不到选项了吗? – eonist

+0

Swift 3.0.2,NSCalendar.current.date(byAdding:.month,value:1,to:date) – KTPATEL

+0

**如何在swift3 **中处理范围。 'calendar.range(.Month,startDate:&startOfMonth,interval:&lengthOfMonth,forDate:date)'。 **错误是>调用额外参数'forDate'** – iDeveloper

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

完美工作nextMonth。关于前一个月 – iDeveloper

+0

@iDeveloper什么只是在功能改变'value'到'-1' –

+0

感谢工作完美 – iDeveloper

我推荐使用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和许多其他有用的方法。