Получить количество дней между двумя NSDates при переходе на новый год

Мне нужно получить количество дней между двумя датами, которые я получу, но если я введу, например,2016-12-10 и 2017-01-10, будет отрицательное количество дней. Это просто происходит, когда наступает новый год между этими двумя датами.

//Get the number of days between two NSDates
func daysBetween(date: NSDate) -> Int {
    let calendar: NSCalendar = NSCalendar.currentCalendar()
    let date1 = calendar.startOfDayForDate(self)
    let date2 = calendar.startOfDayForDate(date)
    let components = calendar.components(.Day, fromDate: date1, toDate: date2, options: [])
    return components.day
}

//Using the function
let daysBetween = fromDate.daysBetween(toDate)

//Printing -334 if new year is between fromDate and toDate
print(daysBetween)

Как я могу изменить свою функцию daysBetween(date: NSDate), чтобы этого не происходило?

Изменить: Пожалуйста, не обращайте внимания на то, почему он печатает точно -334. Это потому, что fromDate и toDate - разные дни месяца. Проблема, которую хочется решить, заключается в том, почему ответ отрицательный, а не 31, как должно быть.

Решено: Оказалось, что многие из вас думали. Значение fromDate больше, чем toDate, и вызывает отрицательное число. Глупая ошибка. Спасибо ребята!

2 ответа

Вам не нужно беспокоиться о минусовых днях. Лучше знать, выбрано ли первое свидание (например, на входе UIDatePicker) больше другого. Это обрабатывается автоматически, когда вы преобразуете обратно в NSDate, Если проблема в том, как распечатать дни, вы можете использовать abs(days),

Сначала сравните обе даты, а затем вы можете получить правильное положительное значение

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

let startDate:NSDate = dateFormatter.dateFromString("2016-12-10")!
let endDate:NSDate = dateFormatter.dateFromString("2017-01-10")!

let cal = NSCalendar.currentCalendar()
let dayUnit: NSCalendarUnit = .Day
if startDate.compare(endDate) == NSComparisonResult.OrderedDescending{
   let components = cal.components(dayUnit, fromDate: endDate, toDate: startDate, options: [])
   print(components)
} else {
   let components = cal.components(unit, fromDate: startDate, toDate: endDate, options: [])
   print(components)
}

Как описать Лео Дабуса

Вы можете сделать это, не сравнивая даты:

let com = cal.components(dayUnit, fromDate: startDate.earlierDate(endDate), toDate: startDate.laterDate(endDate), options: [])
print(com)
Другие вопросы по тегам