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

Posted

技术标签:

【中文标题】如何获取带有年份的月份名称和两个日期之间的年份列表【英文标题】:How to get month name with year and list of years between two Date 【发布时间】:2017-06-13 13:15:19 【问题描述】:

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

日期 1:2016 年 1 月 1 日

日期 2:2017 年 1 月 4 日

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

【问题讨论】:

您的“Date2”不是有效日期。您的意思是改为发布“2017 年 1 月 4 日”吗? 是的,现在是 1/4/2017 @ducan @user459460 现在解决了吗...? 【参考方案1】:
 //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 年 1 月 1 日”至“2017 年 4 月 1 日”之间的日期 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 月” 、“2017 年 5 月”、“2017 年 6 月”、“2017 年 7 月”、“2017 年 8 月”、“2017 年 9 月”、“2017 年 10 月”、“2017 年 11 月”、“2017 年 12 月”、“2018 年 1 月”、“2018 年 2 月” , "2018 年 3 月", "2018 年 4 月"]

【讨论】:

如果 let startMonth: Int = startDate?.month(), let endMonth: Int = endDate?.month() 好的,现在可以工作了,如果我过了一月,就可以获得月数 我想要两个日期之间的月份和年份 它显示了 2016 年和 2017 年的所有月份,我只想要两个日期之间的月份名称和年份【参考方案2】:

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

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
    

【讨论】:

【参考方案3】:
    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"]

【讨论】:

我想要两个日期之间的月份列表,开始日期可以是小于当前今天日期的任何日期 @user459460 从日期字符串中获取月份 MM 值并替换为 startingMonthNumber,endingMonthNumber 值。【参考方案4】:

这是使用Calendar的方法enumerateDates(startingAfter:matching:matchingPolicy:)的解决方案,可以根据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)

【讨论】:

是否有可能得到月份到特定年份 results.month 到 result.Year 的结果? 对不起,我不明白。【参考方案5】:

让“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
    

【讨论】:

以上是关于如何获取带有年份的月份名称和两个日期之间的年份列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个日期之间将所有年份、月份显示为 int?

在日期选择器中未显示月份和年份下拉列表中的数据

MySQL 获取月份、年份的日期列表

如何从 DataFrame 的日期列中提取月份名称和年份

检查过期日期是否无效 - 获取当前月份和年份没有“/”

SQL Server 2008 仅在月份和年份之间选择数据