[英]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.