简体   繁体   English

如何获取包含年份的月份名称和两个日期之间的年份列表

[英]How to get month name with year and list of years between two Date

I want to get list of month names between two dates 我想获得两个日期之间的月份名称列表

Date1 : 1/1/2016 日期1:2016年1月1日

Date2 : 1/4/2017 日期2:2017年4月1日

Result should be : 
    January 2016 
    February 2016
    March 2016
    April 2016 To  April 2017
 //let startDateString:String  = "01/01/2017"
 //let endDateString:String = "04/01/2017"

 let startDateString:String  = "08/01/2016"
 let endDateString:String = "04/01/2018"

 let dateFormtter = DateFormatter()
 dateFormtter.dateFormat = "MM/dd/yyyy"

 let startDate = dateFormtter.date(from: startDateString)
 let endDate = dateFormtter.date(from: endDateString)

 var monthsStringArray = [String]()
 var monthsIntArray = [Int]()
 var monthsWithyear = [String]()
 dateFormtter.dateFormat = "MM"

 if let startYear: Int = startDate?.year(), let endYear = endDate?.year() {

        if let startMonth: Int = startDate?.month(), let endMonth: Int = endDate?.month() {
            for i in startYear...endYear {
                for j in (i == startYear ? startMonth : 1)...(i < endYear ? 12 : endMonth) {
                    let monthTitle = dateFormtter.monthSymbols[j - 1]
                    monthsStringArray.append(monthTitle)
                    monthsIntArray.append(j)

                    let monthWithYear = "\(monthTitle) \(i)"
                    monthsWithyear.append(monthWithYear)
                }
            }
        }

 }

    print(monthsStringArray)
    print(monthsIntArray)
    print(monthsWithyear)


//-------
extension Date {

    func month() -> Int {
        let month = Calendar.current.component(.month, from: self)
        return month
    }

    func year() -> Int {
      let year = Calendar.current.component(.year, from: self)
      return year
   }
}

Result: 结果:
for dates between "01/01/2017" to "04/01/2017" 适用于“01/01/2017”至“04/01/2017”之间的日期
monthsStringArray = ["January", "February", "March", "April"] monthsStringArray = [“一月”,“二月”,“三月”,“四月”]
monthsIntArray = [1, 2, 3, 4] monthsIntArray = [1,2,3,4]
monthsWithyear = ["January 2017", "February 2017", "March 2017", "April 2017"] monthsWithyear = [“2017年1月”,“2017年2月”,“2017年3月”,“2017年4月”]

for dates between "08/01/2016" to "04/01/2018" 适用于“08/01/2016”至“04/01/2018”之间的日期
monthsWithyear = ["August 2016", "September 2016", "October 2016", "November 2016", "December 2016", "January 2017", "February 2017", "March 2017", "April 2017", "May 2017", "June 2017", "July 2017", "August 2017", "September 2017", "October 2017", "November 2017", "December 2017", "January 2018", "February 2018", "March 2018", "April 2018"] monthsWithyear = [“2016年8月”,“2016年9月”,“2016年10月”,“2016年11月”,“2016年12月”,“2017年1月”,“2017年2月”,“2017年3月”,“2017年4月”,“5月2017“,”2017年6月“,”2017年7月“,”2017年8月“,”2017年9月“,”2017年10月“,”2017年11月“,”2017年12月“,”2018年1月“,”2018年2月“,”3月2018年“,”2018年4月“]

Use below code to get a list of years between two dates. 使用下面的代码获取两个日期之间的年份列表。

func getYear(){
    let startDateString:String  = "05/21/2014"
    let endDateString:String = "05/21/2017"

    let dateFormtter = DateFormatter()
    dateFormtter.dateFormat = "MM/dd/yyyy"

    let startDate = dateFormtter.date(from: startDateString)
    let endDate = dateFormtter.date(from: endDateString)

    var arrYears = [String]()
    dateFormtter.dateFormat = "MM"

    if let startYear: Int = startDate?.year(), let endYear = endDate?.year() {
        for i in startYear...endYear {
            let monthWithYear = "\(i)"
            arrYears.append(monthWithYear)
        }
    }
}

extension Date {
   func Year() -> Int {
        let year = Calendar.current.component(.year, from: self)
        return year
    }
}
    var monthsList = [String]()
    let fmt = DateFormatter()
    let startingMonthNumber:Int  = 0
    let endingMonthNumber:Int  = 3

    for i in startingMonthNumber..<endingMonthNumber {
        let monthName = fmt.monthSymbols[i]
        monthsList.append(monthName)
    }

    print(monthsList) //["January", "February", "March"]

This is a solution with the method enumerateDates(startingAfter:matching:matchingPolicy:) of Calendar to enumerate dates very efficiently based on DateComponents 这是使用Calendar的方法enumerateDates(startingAfter:matching:matchingPolicy:)来基于DateComponents非常有效地枚举日期的解决DateComponents

let calendar = Calendar.current
let dateFormtter = DateFormatter()
dateFormtter.dateFormat = "dd/MM/yyyy"

// create the start and end dates from the strings
let startDate = dateFormtter.date(from: "1/1/2016")!
let endDate = dateFormtter.date(from: "1/4/2017")!
// set the date format to the destination format
dateFormtter.dateFormat = "MMMM yyyy"

// Create the matching conponent : day 1 of each month
let components = DateComponents(day: 1)
// The variable result will contain the array of month names,
var result = [dateFormtter.string(from: startDate)]

// this particular method of Calendar enumerates each date matching the components
calendar.enumerateDates(startingAfter: startDate, matching: components, matchingPolicy: .nextTime) { (date, strict, stop) in
    result.append(dateFormtter.string(from: date!))
    // exit the enumeration if the end date is reached
    if date! >= endDate { stop = true }
}

print(result)

Making the 'Krunal' answer a little more clean: 使'Krunal'的答案更加干净:

enum monthYearArrayType {
    case monthsStringArray
    case monthsIntArray
    case monthsWithyear
    case monthsWithyearExceptCurrent
}

func monthsBetweenDates(startDate: Date?, endDate: Date?, displayType: monthYearArrayType) -> Array<Any> {
    let dateFormtter = DateFormatter()

    var monthsStringArray = [String]()
    var monthsIntArray = [Int]()
    var monthsWithyear = [String]()
    var monthsWithyearExceptCurrent = [String]()
    dateFormtter.dateFormat = "MM"

    if let startYear: Int = startDate?.year(), let endYear = endDate?.year() {

        if let startMonth: Int = startDate?.month(), let endMonth: Int = endDate?.month() {
            for i in startYear...endYear {
                for j in (i == startYear ? startMonth : 1)...(i < endYear ? 12 : endMonth) {
                    let monthTitle = dateFormtter.monthSymbols[j - 1]
                    monthsStringArray.append(monthTitle)
                    monthsIntArray.append(j)

                    let monthWithYear = "\(monthTitle) \(i)"
                    monthsWithyear.append(monthWithYear)

                    if(i == Date().year()) {
                        monthsWithyearExceptCurrent.append(monthTitle)
                    } else {
                        monthsWithyearExceptCurrent.append(monthWithYear)
                    }
                }
            }
        }

    }

    switch displayType {
    case .monthsWithyear:
        return monthsWithyear
    case .monthsWithyearExceptCurrent:
        return monthsWithyearExceptCurrent
    case .monthsStringArray:
        return monthsStringArray
    case .monthsIntArray:
        return monthsIntArray
    }
}


extension Date {
    func month() -> Int {
        let month = Calendar.current.component(.month, from: self)
        return month
    }

    func year() -> Int {
        let year = Calendar.current.component(.year, from: self)
        return year
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM