在 swift 的日期范围内获取日期名称和日期重复次数

Get day name and number of times day repeat in date range in swift

我有一个场景,我从后端 API 获取一个日期,我得到一个开始日期和结束日期,现在我想先检查那个日期的日期,例如,今天是 8-11-2019 是星期五,结束日期是 20-11-2019。现在我想检查每个日期的日期名称以及日期在此日期范围内重复的次数。例如,如果星期五在此日期范围内两次,那么我想在星期五单击时获取这些日期,日期范围是动态的,它可以变化。屏幕截图中的示例检查,

这是代码:

let startDate : Date = Date()
let endDate : Date = Date()


let calendar = Calendar.current

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyyMMdd'T'HHmmss.SSS"

let dateFormatter2 = DateFormatter()
dateFormatter2.dateFormat = "EEEE"

let components = calendar.dateComponents([.day], from: startDate, to: endDate) //returns number of days

var date : Date = startDate

var numberOfDays : [String : (Int,[Date])] = ["Sunday" : (0, []), "Monday" : (0, []), "Tuesday" : (0, []), "Wednesday" : (0, []), "Thursday" : (0, []), "Friday" : (0, []), "Saturday" : (0, [])]

while date <= date2 {

    let day : String = dateFormatter2.string(from: date)
    print(day)

    if let value = numberOfDays[day] {
        var tempDateArr = value.1
        tempDateArr.append(date)
        numberOfDays[day] = ((value.0 + 1), tempDateArr)

    }
    date = calendar.date(byAdding: .day, value: 1, to: date)!
}

print(numberOfDays) //  number of times day are repeating

下面的函数return一个[Int: Int]字典,其中键是工作日(由当前日历定义),值是日期范围内出现的次数

func distributionOfDays(from date1: Date, to date2:Date) -> [Int:Int]{
  var date = min(date1, date2)
  let endDate = max(date1, date2)
  var days = [Int:Int]()
  while date <= endDate {
     let day = Calendar.current.component(.weekday, from: date)
     days[day] = (days[day] ?? 0) + 1
     date = Calendar.current.date(byAdding: .day, value: 1, to: date)!
  }
  return days

如果需要,您可以 format/output 使用类似这样的数据:

let days = distributionOfDays(from: date1, to: date2).sorted(by: {[=11=].key < .key})
days.forEach{
   print("\(Calendar.current.shortWeekdaySymbols[[=11=].key - 1]), \([=11=].value)")
}

需要从键中减去 - 1,因为 .weekday 组件是 1 索引的,而 shortWeekDaySymbols 是 0 索引的。