Получить количество дней между двумя 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)