【发布时间】:2019-11-08 11:19:06
【问题描述】:
我有一个场景,我从后端 API 获取日期,我得到一个开始日期和结束日期,现在我想首先检查该日期的日期,例如,今天是 8-11-2019 是星期五,并且结束日期是20-11-2019。现在我想检查每个日期的日期名称以及日期在此日期范围内重复的次数。例如,如果星期五在此日期范围内是两次,那么我想通过单击星期五来获取这些日期,日期范围是动态的,它可能会有所不同。屏幕截图中的示例检查,
【问题讨论】:
我有一个场景,我从后端 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
【讨论】:
下面的函数返回一个 [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
如果需要,您可以使用以下方式格式化/输出数据:
let days = distributionOfDays(from: date1, to: date2).sorted(by: {$0.key < $1.key})
days.forEach{
print("\(Calendar.current.shortWeekdaySymbols[$0.key - 1]), \($0.value)")
}
需要从键中减去 - 1,因为 .weekday 组件是 1 索引的,shortWeekDaySymbols 是 0 索引的。
【讨论】: