2016-11-03 9 views
0

У меня проблемы с NSDateFormatter. Я выполнил выбор даты, где вы можете выбрать две даты для расчета разницы между этими двумя датами и вернуть разницу в днях. Две даты в следующем формате (.MediumStyle):Проблемы с NSDateFormatter, возвращает nil при использовании .dateFromString

var firstDate = "Nov 3, 2016" 
var lastDate = "Nov 9, 2016" 

Однако, когда он попадает в часть в функции, называемой calculateDifference(), где эти два значения преобразуются к типу NSDate, метод возвращает nil.

Мой код выглядит следующим образом:

@IBOutlet weak var startDateOutput: UILabel! // shows start date user picked 
@IBOutlet weak var endDateOutput: UILabel! // shows end date user picked 
@IBOutlet weak var datePicker: UIDatePicker! 
@IBOutlet weak var answerFieldTimeDifference: UILabel! // Output Field 

var firstDate = "" 
var lastDate = "" 

@IBAction func startButton(sender: AnyObject) // Button to set firstDate 
{ 

    firstDate = NSDateFormatter.localizedStringFromDate(datePicker.date, dateStyle: NSDateFormatterStyle.MediumStyle, timeStyle: NSDateFormatterStyle.NoStyle) 
    startDateOutput.text = firstDate 
    calculateDifference() 
} 

@IBAction func expirationButton(sender: AnyObject) // Button to set lastDate 
{ 
    lastDate = NSDateFormatter.localizedStringFromDate(datePicker.date, dateStyle: NSDateFormatterStyle.MediumStyle, timeStyle: NSDateFormatterStyle.NoStyle) 
    endDateOutput.text = lastDate 
    calculateDifference() 
} 

func calculateDifference() 
{ 
    if !firstDate.isEmpty && !lastDate.isEmpty 
    { 
     let dateFormatter = NSDateFormatter() 
     let firstDateAsNSDate = dateFormatter.dateFromString(firstDate) //returns nil 
     let lastDateAsNSDate = dateFormatter.dateFromString(lastDate) //returns nil 

     let dateComponentsFormatter = NSDateComponentsFormatter() 
     dateComponentsFormatter.allowedUnits = [NSCalendarUnit.Day] 

     var calculatedDifference = dateComponentsFormatter.stringFromDate(firstDateAsNSDate!, toDate: lastDateAsNSDate!) 

     answerFieldTimeDifference.text = calculatedDifference 
    } 
} 
+1

Это не имеет никакого смысла использовать строки вообще. Просто держите ссылку на два объекта NSDate. – rmaddy

ответ

0

Причина вы получаете nil в calculateDifference, потому что вы никогда не установить формат даты или стиль на дату форматировщиком.

Но нет никаких оснований использовать строки и форматы даты. Держите все как NSDate и избегайте всей лишней работы.

@IBOutlet weak var startDateOutput: UILabel! // shows start date user picked 
@IBOutlet weak var endDateOutput: UILabel! // shows end date user picked 
@IBOutlet weak var datePicker: UIDatePicker! 
@IBOutlet weak var answerFieldTimeDifference: UILabel! // Output Field 

var firstDate : NSDate? 
var lastDate : NSDate? 

@IBAction func startButton(sender: AnyObject) // Button to set firstDate 
{ 
    firstDate = datePicker.date 
    let dateStr = NSDateFormatter.localizedStringFromDate(firstDate, dateStyle: NSDateFormatterStyle.MediumStyle, timeStyle: NSDateFormatterStyle.NoStyle) 
    startDateOutput.text = dateStr 
    calculateDifference() 
} 

@IBAction func expirationButton(sender: AnyObject) // Button to set lastDate 
{ 
    lastDate = datePicker.date 
    let dateStr = NSDateFormatter.localizedStringFromDate(lastDate, dateStyle: NSDateFormatterStyle.MediumStyle, timeStyle: NSDateFormatterStyle.NoStyle) 
    endDateOutput.text = dateStr 
    calculateDifference() 
} 

func calculateDifference() 
{ 
    if let firstDate = firstDate, let lastDate = lastDate 
    { 
     let dateComponentsFormatter = NSDateComponentsFormatter() 
     dateComponentsFormatter.allowedUnits = [NSCalendarUnit.Day] 

     var calculatedDifference = dateComponentsFormatter.stringFromDate(firstDate, toDate: lastDate) 

     answerFieldTimeDifference.text = calculatedDifference 
    } 
} 
+0

Спасибо, сэр! Ценить это. Сейчас все работает. Хорошего дня! – heisenberg

0

Просто добавьте DateFormat

let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd" 
let firstDateAsNSDate = dateFormatter.dateFromString(firstDate) //returns nil 
let lastDateAsNSDate = dateFormatter.dateFromString(lastDate) //returns nil 

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

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