【问题标题】:How to get previous and next month in calendar-Swift如何在日历-Swift 中获取上个月和下个月
【发布时间】:2016-10-01 08:46:09
【问题描述】:

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

我正在尝试使用 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) {

}

那么上个月和下个月怎么办呢?

【问题讨论】:

    标签: ios swift swift3 calendar


    【解决方案1】:

    像这样试试。

    获取下个月的日期。

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

    获取上个月的日期。

    斯威夫特 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()
    

    【讨论】:

    • Swift 3 版本? dateByAddingUnit 似乎已被替换为:Calendar.current.date(byAdding: .day, value: days, to: date)! 虽然,我再也找不到选项了?
    • Swift 3.0.2, NSCalendar.current.date(byAdding: .month, value: 1, to: date)
    • 如何在 swift3 中处理范围calendar.range(.Month, startDate: &startOfMonth, interval: &lengthOfMonth, forDate: date )错误是 > 调用中的额外参数“forDate”
    • @iDeveloper 像这样试试calendar.range(of: .month, start: &startOfMonth, interval: &lengthOfMonth, for: date)
    • @Jerland2 你有没有试过回答只是说没有尝试。您正在寻找的答案是在任何日期增加价值的完美方式。但是你仍然可以清除你的疑问。请检查这张游乐场的图片,它将清除您的想法。 i.stack.imgur.com/4W9rh.png 从 3 月 30 日减去一个月后检查输出,结果为 2 月 28 日。请在下次发布任何评论之前确认您的想法是否正确
    【解决方案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
    

    【讨论】:

    • 下个月工作完美。上个月呢
    • @iDeveloper 只需将函数中的value 更改为-1
    • 先生,这个 currentDate = nextDate 背后的逻辑是什么
    • 我们需要保存日期,用于下次调用函数
    【解决方案3】:

    斯威夫特 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
    

    快乐编码:)

    【讨论】:

    • 本月寻找答案的操作
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多