如何获取带有年份的月份名称和两个日期之间的年份列表
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
【讨论】:
以上是关于如何获取带有年份的月份名称和两个日期之间的年份列表的主要内容,如果未能解决你的问题,请参考以下文章