2016-11-05 2 views
0

У меня проблемы, и я не могу найти решение для этого. Для выбора даты начала и даты окончания вы можете выбрать дату и две кнопки. Мое приложение вычисляет разницу между этими двумя датами.Вычисленная разница двух NSDates не соответствует -

К сожалению, неверно рассчитанная разница. Например, когда я установил 5 Nov, 2016 в качестве моей первой даты и 6 Nov, 2016 в качестве моей второй даты, код возвращает разницу 0 дней. Когда я изменяю вторую дату 7 Nov, 2016 возвращает разницу 1 дня и т.д. Но, когда я делаю это по-другому, установив первыйlastDate к 6 Nov, 2016, а затемfirstDate к 5 Nov, 2016 разница рассчитывается правильно (мощность 1 день). Это как-то зависит от того, какую дату вы ставите в первую очередь.

Вот мой код:

@IBOutlet weak var startDateOutput: UILabel! 
@IBOutlet weak var endDateOutput: UILabel! 
@IBOutlet weak var datePicker: UIDatePicker! 
@IBOutlet weak var answerFieldTimeDifference: UILabel! 

var firstDate:NSDate? 
var lastDate:NSDate? 

@IBAction func startButton(sender: AnyObject) 
{ 
    firstDate = datePicker.date 
    let dateStr = NSDateFormatter.localizedStringFromDate(firstDate!, dateStyle: NSDateFormatterStyle.MediumStyle, timeStyle: NSDateFormatterStyle.NoStyle) 
    startDateOutput.text = dateStr 

    daysBetweenDates() 
} 

@IBAction func expirationButton(sender: AnyObject) 
{ 
    lastDate = datePicker.date 
    let dateStr = NSDateFormatter.localizedStringFromDate(lastDate!, dateStyle: NSDateFormatterStyle.MediumStyle, timeStyle: NSDateFormatterStyle.NoStyle) 
    endDateOutput.text = dateStr 

    daysBetweenDates() 
} 

func daysBetweenDates() 
{ 
    if var firstDate = firstDate, var lastDate = lastDate 
    {   
     let calendar = NSCalendar.currentCalendar() 

     let firstDate = calendar.startOfDayForDate(firstDate) 
     let secondDate = calendar.startOfDayForDate(lastdate) 

     let components = calendar.components([.Day], fromDate: date1, toDate: date2, options: []) 

     var differenceInDays = components.day 

     answerFieldTimeDifference.text = String(differenceInDays) 
    }  
} 
+2

Форматирование даты и строковая обработка не являются надлежащим образом для расчета дат. Используйте класс 'NSCalendar' для выполнения правильных вычислений даты. – rmaddy

+0

См. Http://stackoverflow.com/questions/24723431/swift-days-between-two-nsdates для правильного решения. – rmaddy

+0

Я пробовал этот новый метод, но когда я хочу установить одну дату, он немедленно сработает. Вы можете мне помочь? – heisenberg

ответ

0

Я нашел решение моей проблемы.

Я добавил следующие две строки в daysBetweenDates() функция

let firstDate = calendar.startOfDayForDate(firstDate) 
let secondDate = calendar.startOfDayForDate(lastdate) 

Код выше обновляется и теперь должен рассчитать разницу правильно.

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