繁体   English   中英

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

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

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