Получите название дня и количество повторений дня в диапазоне дат в swift - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть сценарий, в котором я получаю дату из бэкэнд-API, я получаю дату начала и дату окончания, теперь я хочу сначала проверить день в этой дате, например, сегодня 8-11-2019 - это пятница, идата окончания 20-11-2019. Теперь я хочу проверить каждое название дня, а также количество повторений дня в этом диапазоне дат. Например, если пятница находится в этом диапазоне дат дважды, то я хочу получить эти даты по щелчку пятницы. Диапазон дат является динамическим и может варьироваться. Пример проверки на снимке экрана, enter image description here

Ответы [ 2 ]

1 голос
/ 08 ноября 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
0 голосов
/ 08 ноября 2019

Следующая функция возвращает словарь [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-indexed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...