[英]How to get month name with year and list of years between two Date
我想获得两个日期之间的月份名称列表
日期1:2016年1月1日
日期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
}
}
结果:
适用于“01/01/2017”至“04/01/2017”之间的日期
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月“]
使用下面的代码获取两个日期之间的年份列表。
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"]
这是使用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<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.