2016-06-04 1 views
0

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

//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), чтобы предотвратить это?

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

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

+0

Я не могу воспроизвести проблему. С вашими входными данными результат равен «31». –

+1

Можете ли вы предоставить (небольшой) * автономный * пример, демонстрирующий проблему? –

+2

Я бы посоветовал подтвердить, что две даты - это то, что вы думаете. Например, если вместо «2016-12-10», если первая дата была «2017-12-10», вы получите свой «-334». – Rob

ответ

0

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

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) 
} 

Как описывать Лео Dabus

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

let com = cal.components(dayUnit, fromDate: startDate.earlierDate(endDate), toDate: startDate.laterDate(endDate), options: []) 
print(com) 
+0

Но это не объясняет выход '-334' дней между 2016-12-10 и 2017-01-10. Разница будет либо '31', либо' -31', в зависимости от порядка дат. –

+2

NSDate имеет метод, называемый earlyDate 'cal.components (dayUnit, fromDate: startDate.earlierDate (endDate), toDate: startDate.laterDate (endDate), опции: [])' –

+0

@MartinR Да, я также не собираюсь ни с какой идеей около -334. Согласно вопросу, я думаю, что OP хочет положительную разницу между двумя датами, поскольку новый год существует, поэтому я опубликовал этот ответ. – Pushpa

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^