Как я могу сравнить две даты (NSDate) в Swift 3 и получить дни между ними?

Как я могу сравнить две даты в Swift 3? Я нашел много решений для других версий Swift, но у меня они не работают.

let clickedDay:String = currentcell.DayLabel.text!
    let currentDate = NSDate()
    let currentDay = "" //want the current day
    let dateFormatter = DateFormatter()        
    var dateAsString = ""        
    if Int(clickedDay)! < 10 {            
        dateAsString = "0" + clickedDay + "-11-2016 GMT"
    }
    else {            
        dateAsString = clickedDay + "-11-2016 GMT"
    }

    dateFormatter.dateFormat = "dd-MM-yyyy zzz"
    let clickedDate = dateFormatter.date(from: dateAsString)        
    if currentDate as Date >= clickedDate! as Date {

        return true
    }
    else {
        //Want to get the days between the currentDate and clickedDate
        let daysLeft = ""
    }

Я сравниваю даты буксировки, но мне нужны дни между этими датами буксировки. Может ли кто-нибудь помочь мне, пожалуйста? Спасибо и привет

Добавлено: если у меня есть дата 22.11.2016 и текущая дата (сейчас 18.11.2016), мне нужны дни между ними (в данном случае 4)


person moxmlb    schedule 18.11.2016    source источник


Ответы (4)


Просто сделайте расширение Date вот так и получите разницу в днях.

extension Date {
    func daysBetweenDate(toDate: Date) -> Int {
        let components = Calendar.current.dateComponents([.day], from: self, to: toDate)
        return components.day ?? 0
    }
}

Теперь используйте это расширение, как это

let numOfDays = fromDate.daysBetweenDate(toDate: toDate)

Вы можете использовать DateFormatter для преобразования строки в дату следующим образом.

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy"
dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
let date = dateFormatter.date(from: "18-11-2016")
person Nirav D    schedule 18.11.2016
comment
Где я объявляю расширение? - person moxmlb; 18.11.2016
comment
Получите эту ошибку: использование неразрешенного идентификатора fromDate - person moxmlb; 18.11.2016
comment
Это работает, но если у меня есть 18.11.2016 (от даты) и 22.11.2016 (сегодня), там написано 3 дня - person moxmlb; 18.11.2016
comment
Как я могу дать им правильный часовой пояс? вот так: dateAsString = clickedDay + -11-2016 GMT ?? - person moxmlb; 18.11.2016
comment
@Mbach Проверьте отредактированный ответ, чтобы преобразовать строку в дату, нет необходимости добавлять GMT к вашей строке даты. - person Nirav D; 18.11.2016
comment
@Mbach Я говорю об этом "0" + clickedDay + "-11-2016 GMT" - person Nirav D; 18.11.2016
comment
@Mbach Добро пожаловать :) - person Nirav D; 18.11.2016

Попробуй это

let startDateComparisionResult:ComparisonResult = currentDate.compare(clickedDate! as NSDate)

if startDateComparisionResult == ComparisonResult.orderedAscending
{
    // Current date is smaller than end date.
}
else if startDateComparisionResult == ComparisonResult.orderedDescending
{
    // Current date is greater than end date.
}
else if startDateComparisionResult == ComparisonResult.orderedSame
{
    // Current date and end date are same
}
person Sapana Ranipa    schedule 18.11.2016
comment
Зависит от вашего значения currentDate и clickedDate - person Sapana Ranipa; 18.11.2016

Используйте эту функцию, чтобы получить все промежуточные даты между двумя датами, просто проверьте, больше ли дата спада (конечная дата), чем дата обновления (первая дата), тогда порядок +1, иначе порядок -1: -

func selectDates(from upDate : Date, to downDate : Date, order : Int){
        var selectDate = Calendar.current.date(byAdding: .day, value: order, to: upDate)!
        while compareDate(dateInitial: selectDate, dateFinal: downDate) != true{
            print(" intermediate date is \(selectDate)")
            selectDate = Calendar.current.date(byAdding: .day, value: order, to: selectDate)!
        }
        print("*** intermediate dates are selected ***")

    }


func compareDate(dateInitial:Date, dateFinal:Date) -> Bool {
        let order = Calendar.current.compare(dateInitial, to: dateFinal, toGranularity: .day)
        switch order {
        case .orderedSame:
            return true
        default:
            return false
        }
    }
person Himanshu    schedule 18.11.2016
comment
Мне нужны дни, сколько осталось до следующего свидания - person moxmlb; 18.11.2016

Пытаться:

let days=Calendar.current.dateComponents([.day], from: date_1, to: date_2)
let nb_days=days.day
person Marie Dm    schedule 18.11.2016
comment
Мне нужны дни, сколько осталось до следующего свидания - person moxmlb; 18.11.2016
comment
Я не уверен, что хорошо тебя понимаю. Мой ответ дает вам количество дней между your_date и Date() (то есть сегодня). Но если вы хотите сравнить с другой датой, просто измените Date() на next_date. - person Marie Dm; 18.11.2016
comment
Да, это то, что я хочу. но в днях у меня нет числа, как мне получить число? - person moxmlb; 18.11.2016
comment
Извините, я забыл вторую часть :) Я обновил свой ответ @Mbach - person Marie Dm; 18.11.2016