簡體   English   中英

如何在日歷中獲取上個月和下個月-Swift

[英]How to get previous and next month in calendar-Swift

我試圖通過單擊按鈕來獲取上個月和下個月,但這改變了我的年份,而不是月份。

我正在嘗試使用這個答案,但它在 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 和斯威夫特 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()
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

將在此處添加以防人們下個月也需要。 這適用於任何日期:

Swift 5.1 或更高版本 • Xcode 11 或更高版本


extension Calendar {
    static let iso8601 = Calendar(identifier: .iso8601)
}

extension Date {
    
    var year: Int {
        Calendar.iso8601.component(.year, from: self)
    }
    
    var lastDateOfPreviousMonth: Date? {
        DateComponents(calendar: .iso8601, year: year, month: month, day: 0).date
    }
    var previousMonth: Int {
        lastDateOfPreviousMonth?.month ?? 0
    }
    
    var firstDateOfMonth: Date? {
        DateComponents(calendar: .iso8601, year: year, month: month).date
    }
    var month: Int {
        Calendar.iso8601.component(.month, from: self)
    }

    var firstDateOfFollowingMonth: Date? {
        DateComponents(calendar: .iso8601, year: year, month: month+1).date
    }
    var followingMonth: Int {
        firstDateOfFollowingMonth?.month ?? 0
    }
}

Date().lastDateOfPreviousMonth    //  "Feb 28, 2022 at 12:00 AM"
Date().previousMonth              //  2

Date().firstDateOfMonth           //  "Mar 1, 2022 at 12:00 AM"
Date().month                      //  3

Date().firstDateOfFollowingMonth  // "Apr 1, 2022 at 12:00 AM"
Date().followingMonth             //  4

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

快樂編碼:)

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

使用以下代碼片段獲取 Swift 中的任何前一年或前一個月的日期

private func getPreviousDate(monthOrYear: String, numberOfMonthOrYear: Int, dateFormat: String) -> String{
    var date : Date
    if(monthOrYear.lowercased().contains("month")){
        date = Calendar.current.date(byAdding: .month, value: -numberOfMonthOrYear, to: Date())!
    } else {
         date = Calendar.current.date(byAdding: .year, value: -numberOfMonthOrYear, to: Date())!
    }
    return dateFormatter(dateFormat: dateFormat, date:date)
}

func dateFormatter (dateFormat: String, date: Date) -> String{
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateFormat
    return dateFormatter.string(from: date)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM