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

我想获得两个日期之间的月份名称列表

日期1:2016年1月1日

日期2:2017年4月1日

Result should be : January 2016 February 2016 March 2016 April 2016 To April 2017 

使用下面的代码获取两个日期之间的年份列表。

 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 } } 
  //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 } } 

结果:
适用于“2017/01/01”至“2017/01/04”之间的日期
monthsStringArray = [“一月”,“二月”,“三月”,“四月”]
monthsIntArray = [1,2,3,4]
monthsWithyear = [“2017年1月”,“2017年2月”,“2017年3月”,“2017年4月”]

适用于“08/01/2016”至“04/01/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月“]

  var monthsList = [String]() let fmt = DateFormatter() let startingMonthNumber:Int = 0 let endingMonthNumber:Int = 3 for i in startingMonthNumber.. 

这是使用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) 

使’Krunal’的答案更加干净:

 enum monthYearArrayType { case monthsStringArray case monthsIntArray case monthsWithyear case monthsWithyearExceptCurrent } func monthsBetweenDates(startDate: Date?, endDate: Date?, displayType: monthYearArrayType) -> Array { 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 } }