【问题标题】:Get day name and number of times day repeat in date range in swift快速获取日期范围内的日期名称和日期重复次数
【发布时间】:2019-11-08 11:19:06
【问题描述】:

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

【问题讨论】:

    标签: swift date calendar


    【解决方案1】:

    代码如下:

    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
    

    【讨论】:

    • 这是否会返回我的日期作为日期,就像如果星期天是两个在范围内,那么点击星期天它应该给我两个星期天的日期。 @SGDEV
    • 是的,在字典中我们有一个元组,其中第一个值有 numberOfCount,第二个值有一个日期数组,键是 Day(星期日、星期一等),所以你有所有数据必填。
    • 非常感谢,我明白了。 @SGDev
    【解决方案2】:

    下面的函数返回一个 [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 索引的。

    【讨论】:

    • 哎呀。这在某种程度上重复了 SGDev 在我开始输入时尚未发布的早期答案,尽管它通过坚持使用日历功能采用了不同的方法。您现在可以选择有效的方法:-)
    • 谢谢你的回答我明白了。:) .@flanker
    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2014-01-07
    • 2021-08-21
    • 2013-04-02
    • 2015-07-26
    相关资源
    最近更新 更多