【问题标题】:How to check time overlap in swift?如何快速检查时间重叠?
【发布时间】:2018-12-10 05:32:29
【问题描述】:

我的视图中有 4 个 startTime datePicker 和 4 个 endTime datePicker。 我想检查时间是否重叠。

Ex. slot 1 = 09:00 - 12:00
slot 2 = 08:00 - 11:00
slot 3 = 05:00 - 10:30
slot 4 = 11:00 - 16:00

我使用这个公式将这个时间转换为十进制:

(分钟+(小时*6))/10

现在我有十进制时间,所以我尝试了以下代码:

for item in validationArray! {
            let startIndexvalue:Int = item["startTime"]!
            let stopIndexvalue:Int = item["stopTime"]!

            print(startIndexvalue)
            print(stopIndexvalue)
            print(fastLinkStartTime)

            if stopIndexvalue > startIndexvalue {
                if startIndexvalue ... stopIndexvalue ~= fastLinkStartTime {

                    if startIndexvalue == 0 {
                        validationTimeDic["startTime"] = fastLinkStartTime
                        timeDic["startTime"] = hours + "0"
                    }

                    else {
                        showValidationAlert(title: NSLocalizedString("You can not select time in between existing time slot.", comment: ""), message: "")
                        DispatchQueue.main.async {
                            self.StartTime.text = "--:--"
                        }

                        validationTimeDic["startTime"] = 0
                        timeDic["startTime"] = "--:--"
                    }

                    validationArray?[currentRow] = validationTimeDic
                    self.currentObject!.validationData[currentSection.description] = validationArray

                    array?[currentRow] = timeDic
                    self.currentObject!.mondayToSundayData[currentSection.description] = array

                    print(self.currentObject!.validationData)

                }
            }

请给我任何想法吗?

【问题讨论】:

  • @SPatel 实际上 SO 是一个解决方案提供商。我认为您的意思是“如果您自己不努力解决问题,您将无法获得帮助”。
  • @SPatel 这正是我的观点。

标签: ios swift time datepicker


【解决方案1】:

您需要检查两个Date 范围是否重叠。您可以通过检查一个 ClosedRange<Date> 是否与另一个重叠来做到这一点

let isOverlapping = (startDate1...endDate1).overlaps(startDate2...endDate2)

但是对于您的情况,如果此时间(在您的情况下为 Int 索引)与数组中的任何其他时间重叠,则您不想将其附加到数组中,因此在附加此新时间之前,请检查是否与某些时间重叠其他时间。如果不附加,如果有,随心所欲。

let array: [[String: Int]] = ...
let newStartIndex: Int = ...
let newEndIndex: Int = ...
let isOverlapping = array.allSatisfy { $0["startTime"] <= newEndIndex && newStartIndex <= $0["stopTime"]}

【讨论】:

    【解决方案2】:

    您可以为此用途扩展 Range 类,也可以在 CGRect 类上使用交集。

    // CGRect 用法

    var r1 = CGRect(x: 4.8, y: 0, width: 1.8, height: 1)
    var r2 = CGRect(x: 5.8, y: 0, width: 2, height: 1)
    var r3 = CGRect(x: 6, y: 0, width: 0.8, height: 1)
    
    r1.intersection(r2).intersection(r3)
    

    // ClosedRange 用法

    extension CountableClosedRange where Bound == Int {
            func intersection(_ range: CountableClosedRange<Int>) -> CountableClosedRange<Int>? {
                if(self.lowerBound >= range.upperBound) {
                    return nil;
                }
                if(self.upperBound <= range.lowerBound) {
                    return nil;
                }
                return CountableClosedRange(uncheckedBounds:
                    (lower: self.lowerBound > range.lowerBound ?
                        self.lowerBound
                        :range.lowerBound,
                     upper: self.upperBound < range.upperBound ?
                        self.upperBound
                        :range.upperBound))
            }
        }
    
        func convertTime(h:Int, m: Int = 0) -> Int {
            return m+h*60;
        }
        var range1 = CountableClosedRange(uncheckedBounds: (lower: 48 , upper: 56))
        var range2 = CountableClosedRange(uncheckedBounds: (lower: 53 , upper: 55))
        var range3 = CountableClosedRange(uncheckedBounds: (lower: 45 , upper: 54))
        var range4 = CountableClosedRange(uncheckedBounds: (lower: 47 , upper: 64))
        let arr = [range2,range3,range4]
        var resultRange:CountableClosedRange<Int>? = range1
        for item in arr {
            resultRange = resultRange?.intersection(item)
        }
    

    【讨论】:

      【解决方案3】:
        for i in 0..<validationArray!.count {
                      var currentItem = validationArray![i]
                      let currentStart:Int = currentItem["startTime"]!
                      let currentEnd:Int = currentItem["stopTime"]!
                      if currentStart != 0 && currentEnd != 0 {
                          if i < (validationArray?.count)! - 1  {
                              let nextItem = validationArray![i+1]
                              let nextStart:Int = nextItem["startTime"]!
                              let nextEnd:Int = nextItem["stopTime"]!
                              if currentEnd > currentStart {
                                  if nextEnd  <  currentStart {
                                      currentItem["stopTime"] = fastLinkStopTime
                                      timeDic["stopTime"] = hours + "0"
                                  }
                                  else if nextStart >  currentEnd {
                                      currentItem["stopTime"] = fastLinkStopTime
                                      timeDic["stopTime"] = hours + "0"
                                  }
                                  else {
                                      showValidationAlert(title: NSLocalizedString("Your heating time is in an already set heating interval.", comment: ""), message: "")
                                      DispatchQueue.main.async {
                                          self.StopTime.text = "--:--"
                                      }
                                      fastLinkStopTime = 255
                                      timeDic["stopTime"] = "--:--"
                                      dataArray?[currentRow] = timeDic
                                      self.currentObject!.mondayToSundayData[currentSection.description] = dataArray
                                  }
                              }
                              else {
                                  showValidationAlert(title: NSLocalizedString("Please check your entry. The start time must not be before the end time.", comment: ""), message: "")
                                  DispatchQueue.main.async {
                                      self.StopTime.text = "--:--"
                                  }
                              }
                          }
                          else
                          {
                              break
                          }
                      }
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-08
        • 2016-08-25
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-26
        • 2014-08-29
        相关资源
        最近更新 更多