ios - 如何在日历中获取上个月和下个月-Swift

标签 ios swift swift3 calendar

我试图通过单击按钮获取上个月和下个月,但这改变了我的年份,而不是月份。

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

}

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

最佳答案

尝试这样。

获取下个月的日期。

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

获取上个月的日期。

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() 与您的 NSDate 对象。

编辑:为了继续下个月和上个月的旅行,您需要存储一个日期对象 currentDate,当您尝试获取下个月和上个月时,请使用该日期对象并更新它。

下个月。

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

上个月。

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

您还可以使用扩展程序,让事情变得简单。

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 或更低版本

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

关于ios - 如何在日历中获取上个月和下个月-Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56468856/

相关文章:

ios - 识别 UIWebView 中的多个链接

ios - 如何在 Swift 中从 "without navigation bar view controller"转到 "with navigation bar view controller"

iphone - 安装应用程序后,iTunes 是否会在 iPhone 上传递推荐参数?

ios - 核心数据异常错误 - 无效的获取请求 : HAVING with no GROUP BY with userInfo of (null)

swift - 需要导入 UIKit 的新项目文件

swift - 使用 RxSwift 从 ViewController 向 ViewModel 传递值

arrays - 在数组中存储数据的问题 - Swift

python - 在 swift 和 python 中从相同的返回类型获得不同的结果

swift - 闭包声明返回类型

ios - 您可以在 Interface Builder 中创建带有自定义 View 的 UIBarButtonItem