Как определить, когда несколько (n) диапазонов даты и времени перекрывают друг друга - PullRequest
0 голосов
/ 30 мая 2018

Я ищу функцию, которую я могу вызвать, которая скажет мне, какие диапазоны даты и времени доступны всем (p) людям одновременно.Пожалуйста, помогите мне для языка Objective-C или Swift.

p1: start: "2016-01-01 12:00", end: "2016-05-01 03:00"
p2: start: "2016-01-01 03:00", end: "2016-05-01 03:00"
p3: start: "2016-01-01 03:00", end: "2016-04-30 13:31"

В приведенном выше примере ответ должен быть:

start: 2016-04-30 12:00, end: 2016-04-30 13:31

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вам необходимо выполнить следующие шаги:

  1. Преобразовать строку даты в объекты Date.
  2. Создать DateIntervals с вашими объектами даты начала и окончания.
  3. Выполните цикл между интервалами и проверьте на пересечение.

Вот быстрый код, который я могу быстро придумать:

func answer()  {
    let dateFormat = "yyyy-MM-dd HH:mm Z"
    // Date ranges
    let times = [["start": "2016-01-01 12:00 +0000", "end": "2016-05-01 03:00 +0000"],
                 ["start": "2016-01-01 03:00 +0000", "end": "2016-05-01 03:00 +0000"],
                 ["start": "2016-01-01 03:00 +0000", "end": "2016-04-30 13:31 +0000"]]

    var intervals = [DateInterval]()
    // Loop through date ranges to convert them to date intervals
    for item in times {
        if let start = convertStringToDate(string: item["start"]!, withFormat: dateFormat),
            let end = convertStringToDate(string: item["end"]!, withFormat: dateFormat) {
            intervals.append(DateInterval(start: start, end: end))
        }
    }

    // Check for intersection
    let intersection = intersect(intervals: intervals)
    print(intersection)
}

// Converts the string to date with given format
func convertStringToDate(string: String, withFormat format: String)  -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = format
    return dateFormatter.date(from: string)
}

// Cehck for intersection among the intervals in the given array and return
    // the interval if found.
    func intersect(intervals: [DateInterval]) -> DateInterval? {
        // Algorithm:
        // We will compare first two intervals.
        // If an intersection is found, we will save the resultant interval
        // and compare it with the next interval in the array.
        // If no intersection is found at any iteration
        // it means the intervals in the array are disjoint. Break the loop and return nil
        // Otherwise return the last intersection.

        var previous = intervals.first
        for (index, element) in intervals.enumerated() {
            if index == 0 {
                continue
            }

            previous = previous?.intersection(with: element)

            if previous == nil {
                break
            }
        }

        return previous
    }

Примечание: Пожалуйста, проверьтес несколькими примерами.Я проверил с указанными выше диапазонами дат, и он работает нормально.

0 голосов
/ 30 мая 2018

Конвертируйте ваши пары дат в объекты NSDateInterval и найдите их пересечение:

https://developer.apple.com/documentation/foundation/nsdateinterval/1641645-intersectionwithdateinterval

Документы даже предоставляют довольно приятную диаграмму:

enter image description here

...